我在python2中有以下代码。如果我们不通过“自我”,我想知道继承是否有效或基本课程是否有效。或者没有在课堂上使用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>>
为什么不打印&#34; Animal&#34;这里吗?
答案 0 :(得分:0)
由于你是在有效地发起狗,你正在创建一个self
。因此,当您编写d.whoAmi()
时,解释器会将self
作为函数参数插入。
如果您尝试过:
d = Dog
d.whoAmi()
它应该按预期工作。
顺便说一下,你应该把装饰师@staticmethod
放在你whoAmi
函数的顶部,让它像你一样工作。
答案 1 :(得分:0)
让我们先解决为什么不打印“动物”。
线索在错误信息中:
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知道该方法是在一个实例上调用的,并将该实例作为该方法的第一个参数传递。