繁体   English   中英

当您在继承的类中声明方法时不传递“自我”时会发生什么

[英]what happens when you don't pass 'self' while declaring a method inside a inherited class

我在python2中有以下代码。 我想知道如果我们不通过'self'或在类中没有init方法的话,继承是工作还是基本类工作。

这是代码

 class Animal:
   def whoAmi():
   print "Animal"

  >>> class Dog(Animal):
      pass
     ...
  >>> d= Dog()
  >>> d.whoAmi
  <bound method Dog.whoAmi of <__main__.Dog instance at 0x0000000004ED3348>>
  >>> d.whoAmi()
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  TypeError: whoAmi() takes no arguments (1 given)
  >>> d.whoAmi
  <bound method Dog.whoAmi of <__main__.Dog instance at 0x0000000004ED3348>>

为什么不在这里打印“动物”?

由于您正在有效地发起Dog,因此您正在创建一个self 因此,当您编写d.whoAmi() ,解释器将self插入为函数参数。

如果您尝试:

d = Dog
d.whoAmi()

它应该按预期工作。 顺便说一句,您应该将装饰器@staticmethod放在whoAmi函数的顶部,以使其按您的方式工作。

首先让我们解决为什么它不打印“动物”。

提示是在错误消息中:

TypeError:whoAmi()不接受任何参数( 给定1个

当您执行d.whoAmi() ,Python真正在做的是Dog.whoAmi(d) 由于您的方法不接受任何参数,因此会出现该异常。

按照惯例(Python中许多样式“规则”就是这种情况),对于那些在实例上工作的类的方法,第一个参数称为self 但是,可以将其命名为任何您想要的名称。 要记住的关键是必须至少有一个论点 您可以随意命名,但是Python社区的共识是将其称为self

这是一个示例,说明您称它真的无关紧要:

>>> class Foo():
...   def whoami(blah):
...      print "Boo"
...
>>> a = Foo()
>>> a.whoami()
Boo

即使您没有使用self方法,继承也可以正常工作,因为在Python中使用类级方法是完全正常的。

所有具有双下划线的方法(有时称为“ dunder”方法),例如__init__是可选的。 如果默认功能适合您,则无需定义它们。

这里要记住的关键是, self的参数是由Python隐式传递的。 你不是真的“超越” self Python知道正在实例上调用该方法,并将实例作为第一个参数传递给该方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM