Python2中继承类未传self、无__init__时的运行问题咨询
关于Python 2中无self、无__init__类的继承问题解答
咱们来拆解一下你遇到的这个问题——首先得明确:继承机制本身是正常工作的,但你调用方法时的报错是因为Python实例方法的参数规则,和有没有定义__init__无关。
先还原你的代码和报错场景:
class Animal: def whoAmi(): print "Animal" class Dog(Animal): pass d = Dog() print d.whoAmi # 输出 <bound method Dog.whoAmi of <__main__.Dog instance at 0x0000000004ED3348>> d.whoAmi() # 抛出参数不匹配的异常
为什么会触发报错?
在Python中,当你用实例对象调用方法时,解释器会自动把这个实例作为第一个参数传递给方法——这就是为什么我们写实例方法时必须加self(这个名字只是约定,叫别的也可以)作为第一个参数。
你的Animal.whoAmi()没有定义任何参数,当你用d.whoAmi()调用时,Python会尝试把d传给这个方法,但方法接受0个参数却收到了1个,自然就抛出TypeError了。
那继承在这里起作用了吗?
当然起作用了!你看到的<bound method Dog.whoAmi of ...>已经明确说明:Dog类成功继承了Animal的whoAmi方法,只是这个方法的定义不符合实例调用的参数要求。
怎么修复这个问题?
有两种常见解决方案:
改成标准实例方法:给
whoAmi加上self参数,这样实例调用时Python自动传入的实例就有地方接收了:class Animal: def whoAmi(self): print "Animal"此时
d.whoAmi()就能正常输出Animal了。改成静态方法:如果这个方法不需要访问实例或类的属性,只是单纯的功能函数,可以用
@staticmethod装饰器标记,这样调用时就不会自动传递参数:class Animal: @staticmethod def whoAmi(): print "Animal"不管是用
Animal.whoAmi()还是d.whoAmi()都能正常运行。
另外补充一点:有没有__init__方法不影响这个问题——__init__只是实例初始化的钩子,和方法的参数规则、继承逻辑没有直接关联。
内容的提问来源于stack exchange,提问作者susheelbhargavk
相关产品推荐
相关产品推荐

