[英]What happens when you access a class-variable from inside an instance with a self-reference?
[英]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.