最近写类继承时发现python的继承需要改动基类参数才能实现调用父类的构造函数,这样在继承父类后,特别是对于多继承时,发现传递参数不成功,最后我修改了父类的成员变量顺序才成功(欢迎有其他想法的同行留下自己的思考,我只能解决问题,还没找到出现原因)。 问题和全部代码已经上传github上。
需求如下
Item为父类,成员变量为name和aomunt, 成员函数分别为buy,sell和get操作;
先一个子类NewBook 需要继承Item,只需要用到amont变量,name为固定字符串。且只能继承它的成员变量和成员方法,NewBook不能重新覆盖Item的方法和变量。笔者在如下代码中子类NewBook中使用2种方法去调用父类构建方法,都失败。并报同一个错误!
#父类
class Item(object):
def __init__(self,name,amount):
self.name = name
self.amount = amount
def buy(self, number):
self.amount += number
def sell(self, number):
self.amount -= number
def getName(self):
return self.name
def getAmount(self):
return self.amount
#子类
class NewBook(Item):
def __init__(self,amount):
#Item.__init__(self,name = "new book",amount) #第一种方法调用父类构造函数
super(NewBook, self).__init__(name = "new book"amount) #第2种方法调用父类构造函数
def buy(self):
Item.buy(self, number=10)
def sell(self):
Item.sell(self, number=1)
第一种构造方法结果:
第2种方法报错结果:
因为笔者想传递的name为固定参数,aomunt 为用户自定义参数,所以只能这样传递。那为什么不能传递到父类的构造函数,或者说父类的构造函数没有识别到传递的参数呢,我在修改父类的传参顺序后这个问题就解决了(题目所说弊端所在)
class Item(object):
def __init__(self,amount,name): #改变部分
self.name = name
self.amount = amount
def buy(self, number):
self.amount += number
def sell(self, number):
self.amount -= number
def getName(self):
return self.name
def getAmount(self):
return self.amount
class NewBook(Item):
def __init__(self,amount):
super(NewBook, self).__init__(amount,name = "new book") #改变部分
def buy(self):
Item.buy(self, number=10)
def sell(self):
Item.sell(self, number=1)
既后传递默认参数,amount放在前面
需要进一步了解出现原因和分析,可直接访问仓库查看。问题背景和全部代码已经上传github上