在下面的代码示例中,我在派生类中使用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()
答案 0 :(得分:3)
除非你在一个可以消除它的子类中做某事,否则是的。分配给Python对象的属性只是添加到对象的__dict__
中(除了使用插槽的相对罕见的情况或重写__setattr__
以执行非标准的操作),以及隐含的第一个参数对于源自子类或父类的方法,绑定成员方法将是相同的。 Vanilla实例属性(尽管不是方法或类属性)不以任何方式绑定到特定的类定义,而只绑定到它们所属的对象实例。
该声明的一个警告是名称以双下划线开头的属性。它们仍将被添加到__dict__
并且可访问,但它们将被命名为mangled,因此只有在使用属性名称的错位转换检索时才能在定义类之外访问它们。