2015-04-17 46 views
0

下面是我在Python试过(2.7.9)外壳(IDLE在Windows上):添加一个成员变量继承类在Python

>>> 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' 

问题是,为什么方法流()未定义?环顾四周,我得到的印象是,在对象构建阶段,可能需要在init()中初始化成员变量,但这也没有帮助。

+0

顺便说一句,你直接写的问题是“为什么方法流()未定义”。它抱怨的是_attribute_“flow”不存在。我敢肯定,你期望一个正常的数据属性(一个变量指的是数字64),而不是一个方法,对吗? – abarnert

回答

3

flow分配流量仅仅是一个局部变量,只要是生活的这个方法,然后就离开。

self.flow是一个实例变量。这就是你想要的。

(如果你从像C另一种语言++具有对成员的隐式this/self来了... Python不有。Guido explains why,甚至与一些巧妙的构思,使历史的原因不再是相关的, Python中仍然没有这一点,可能永远也不会。)


作为一个方面说明,在Python 2.7,总是用class A(object):,不class A:。否则,你正在创建旧式的类。这不会让这种情况下的差异,但在它确实有所作为的情况下,你总是希望新的行为。*


环顾四周,给我的感觉,也许成员变量可能必须在对象构建阶段在init()中初始化,但这也没有帮助。

那么,首先,它是__init__;在对象构建过程中,不会调用一个名为init的方法。

无论如何,通常你想要__init__中创建所有属性。 (这是一个简单的方法来保证你类型的所有实例都有这些成员,除非你自己,当然......)但是没有什么需要你。在Python中,你可以随时添加和删除属性的对象。**


*有某些情况下,可以说你不这样做,但如果你不知道的那些情况下,如何评估这些论点,他们不适用于你。

**除非班级阻止你这样做。许多内建类型都有;你可以用__slots__自己做一些类似的事情;或者你甚至可以写一个自定义的__setattr__方法来做你想做的任何事情。

+0

谢谢澄清,绝对清楚。 – icarus74

4

你不是对自己的类的实例

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

more on scoping

+0

明白了,谢谢。 – icarus74