python类继承bug

     最近写类继承时发现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上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值