ООП Python добавить какой-либо атрибут в базовый класс? - PullRequest
0 голосов
/ 16 апреля 2011

Я изучаю ООП с python. Пытаясь с помощью небольшого консольного приложения Stock

class Stock(object):

    def __init__(self, stockName, stockLimit, inStock, rentPrice):

        self.stockName  = stockName   # private
        self.stockLimit = stockLimit  # private
        self.inStock    = inStock     # private
        self.rentPrice  = rentPrice   # private

    def inputStock(self, nProduct):

        if(nProduct >= (self.stockLimit - self.inStock)):
            self.inStock = self.stockLimit
        else:
            self.inStock += nProduct 

    def invoice(self, nDay):
        return self.rentPrice * nDay


class StockProduct(Stock):

    def __init__(self, factor):
        # the base-class constructor:
        Stock.__init__(self, stockName, stockLimit, inStock, rentPrice)
        self.factor = factor # Extra for this stock

    def invoice(self, nDay):
        return Stock.invoice(self, nDay) * self.factor

class StockMaterial(Stock):

    def __init__(self,factor):
        # the base-class constructor:
        Stock.__init__(self, stockName, stockLimit, inStock, rentPrice)
        self.factor = factor # Extra for this stock

    def invoice(self,nDay):
        return Stock.invoice(self, nDay)*self.factor

if __name__ == "__main__":

    N = nDay = 0
    myStock = Stock("stock111", 500, 200, 400000)
    N = float(raw_input("How many product into stock: "+str(myStock.stockName)+" ? "))
    myStock.inputStock(N)
    nDay = int(raw_input("How many days for rent : "+str(myStock.stockName)+" ? "))
    print "Invoice for rent the stock: "+str(myStock.stockName)+ " = "+ str(myStock.invoice(nDay))

    StockProduct = StockProduct("stock222",800, 250, 450000, 0.9)

    N = float(raw_input("How many product into stock: "+str(StockProduct.stockName)+" ? "))
    StockProduct.inputStock(N)
    nDay = int(raw_input("How many days for rent : "+str(StockProduct.stockName)+" ? "))
    print "Invoice for rent the stock: "+str(StockProduct.stockName)+ " = "+ str(StockProduct.invoice(nDay))

У меня два вопроса:

  1. с моим методом invoice, как я могу сделать перегрузку метода в python?
  2. Я добавил некоторый атрибут в дочерний процесс. Я получил следующее сообщение об ошибке:

    StockProduct = StockProduct("stock222",800, 250, 450000, 0.9)
    TypeError
    
    error: __init__() takes exactly 2 arguments (6 given)
    

Что мне здесь делать?

Кто-нибудь может мне помочь, пожалуйста?

Спасибо заранее

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011
  1. Перегруженный invoice в производном классе должен работать нормально.

  2. Ваш конструктор базового класса должен иметь все параметры, поэтому:

    class StockProduct(Stock):
        def __init__(self, stockName, stockLimit, inStock, rentPrice, factor):
            # the base-class constructor:
            Stock.__init__(self, stockName, stockLimit, inStock, rentPrice)
            self.factor = factor
    
        def invoice(self, nDay):
            return Stock.invoice(self, nDay) * self.factor
    
2 голосов
/ 16 апреля 2011

1 - Да, вы можете выполнять перегрузку методов в python.

2 - Ваш дочерний класс изменил сигнатуру метода.Вы должны объявить его как

def __init__(self, stockName, stockLimit, inStock, rentPrice, factor):

, если вы хотите построить его со всеми аргументами из родительского класса плюс некоторые дополнительные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...