在派生类和基类成员变量的关系中对self感到困惑

时间:2013-07-17 13:40:59

标签: python class

在下面的代码示例中,我在派生类中使用self.number,b,并且在(基类)中定义了number。如果在基类中以这种方式定义数据成员,那么它是否始终可以被任何派生类访问?

我正在使用Python 2.7。这是引用基础对象成员变量的正确方法吗?

class a(object):
    def __init__(self, number):
        self.number = number
        print "a __init__ called with number=", number

    def printme(self):
        print self.number



class b(a):
    def __init__(self, fruit):
        super(b, self).__init__(1)
        self.fruit = fruit
        print "b __init__ called with fruit=", fruit

    def printme(self):
        print self.number


cl1 = a(1)
cl1.printme()

cl2 = b("apple")
cl2.printme()

1 个答案:

答案 0 :(得分:3)

除非你在一个可以消除它的子类中做某事,否则是的。分配给Python对象的属性只是添加到对象的__dict__中(除了使用插槽的相对罕见的情况或重写__setattr__以执行非标准的操作),以及隐含的第一个参数对于源自子类或父类的方法,绑定成员方法将是相同的。 Vanilla实例属性(尽管不是方法或类属性)不以任何方式绑定到特定的类定义,而只绑定到它们所属的对象实例。

该声明的一个警告是名称以双下划线开头的属性。它们仍将被添加到__dict__并且可访问,但它们将被命名为mangled,因此只有在使用属性名称的错位转换检索时才能在定义类之外访问它们。