这是我在Python(2.7.9)shell(Windows上的IDLE)中尝试过的东西:
>>> class A:
def bob(self, x):
self.val = x*x
接下来是:
>>> class B(A):
def bob(self,x):
flow = x*x*x
A.bob(self, x)
然后:
>>> y = B()
>>> y.bob(4)
>>> y.val
16
>>> y.flow
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
y.flow
AttributeError: B instance has no attribute 'flow'
问题是,为什么方法flow()未定义?环顾四周,我得到的印象是,在对象构建阶段,可能必须在 init ()中初始化成员变量,但这也无济于事。
答案 0 :(得分:4)
您没有将流分配给类实例
class B(A):
def bob(self,x):
flow = x*x*x # should be self.flow
A.bob(self, x)
答案 1 :(得分:3)
flow
本身只是一个局部变量,只要这个方法存在,就会消失。
self.flow
是一个实例变量。这就是你想要的。
(如果您来自其他语言,例如C ++,对于成员有隐式this
/ self
...... Python没有。Guido explains why即使有一些聪明的想法使得历史原因不再相关,Python仍然没有那个,也许永远不会。)
作为旁注,在Python 2.7中,始终使用class A(object):
,而不是class A:
。否则,您将创建旧式类。在这种情况下,这并没有什么不同,但是在 产生影响的情况下,你总是想要新的行为。*
环顾四周,我得到的印象是,在对象构建阶段,可能必须在init()中初始化成员变量,但这也没有帮助。
嗯,首先,它是__init__
;一个名为init
的方法在对象构造期间不会被调用。
无论如何,通常你想要在__init__
中创建所有属性。 (这是保证您所有类型的所有实例都会拥有这些成员的一种简单方法 - 除非您del
他们,当然......但是 你到。在Python中,您可以随时向对象添加和删除属性。**
*有些情况可以说你不是,但如果你不知道这些案件以及如何评估这些论点,那么它们就不适用于你。< /子>
**除非上课阻止你这样做。许多内置类型做;你可以用__slots__
自己做类似的事情;或者您甚至可以编写一个自定义__setattr__
方法来执行任何操作。