在Python中将成员变量添加到继承的类

时间:2015-04-17 06:06:27

标签: python oop

这是我在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 ()中初始化成员变量,但这也无济于事。

2 个答案:

答案 0 :(得分:4)

您没有将流分配给类实例

class B(A):
    def bob(self,x):
        flow = x*x*x  # should be self.flow
        A.bob(self, x)

more on scoping

答案 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__方法来执行任何操作。