当你没有通过“自我”时会发生什么?同时在继承的类中声明一个方法

时间:2018-04-24 02:57:16

标签: python oop

我在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;这里吗?

2 个答案:

答案 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知道该方法是在一个实例上调用的,并将该实例作为该方法的第一个参数传递。