python类继承:派生类问题的构造函数



我有两个类:基类a和派生类B。在B的构造函数中,我尝试使用a的构造函数来初始化实例。为什么派生类的构造函数中的赋值"self-A(x)"不起作用?

class A:
def __init__(self, x=0):
print "constructing A"
self.x = x
def printx(self):
print "x =",self.x 
class B(A):
def __init__(self,x):
A.__init__(self)
print "constructing B"
self = A(x)
self.printx()

b = B(2)
b.printx()

输出:

constructing A
constructing B
constructing A
x = 2
x = 0

您不想在B.__init__中调用构造函数,应该将x传递给A.__init__

class A:
def __init__(self, x=0):
print "constructing A"
self.x = x
def printx(self):
print "x =",self.x 
class B(A):
def __init__(self,x):
A.__init__(self, x)
print "constructing B"
self.printx()

在Python中,将变量名(如self)视为"指向"或"引用"值。当您创建B:的实例时

b = B(2)

调用B.__init__方法时,变量self已分配给B的早期实例。现在,在这个方法中,当Python到达时

self = A(x)

变量CCD_ 9被重新分配给CCD_。B的实例仍然存在;self不再指向它。

请注意,self和Python中的任何其他变量一样是一个变量。(self不是关键字,方法的第一个参数称为self只是一种惯例。)


顺便说一下,要用x的值初始化self,请使用

class B(A):
def __init__(self,x):
A.__init__(self, x)    # <-- Note the x
print "constructing B"
self.printx()

然后

b = B(2)
b.printx()

产生

constructing A
constructing B
x = 2
x = 2

当一个类有一个替代构造函数(如getA)时,Python中的一个典型模式是使用classmethod:

class A(object):
def __init__(self, x=0):
print "constructing A"
self.x = x
def printx(self):
print "x =",self.x 
@classmethod
def getA(cls, x):
print('constructing getA')
self = cls(x)
self.y = 1
return self

现在要使用类方法getA创建A的实例,您可以说

a = A.getA(x)

A作为第一参数传递给类方法getA,并存储在变量cls中。

这样做(而不是使用工厂函数getA)的美妙之处在于,如果您像这样对A进行子类化:

class B(A):
def __init__(self,x):
A.__init__(self, x)
print "constructing B"
self.printx()

然后您也可以使用getA类方法创建B的实例:

b = B.getA(2)

产生

constructing getA
constructing A
constructing B
x = 2

print(type(b))
print(b.y)

产生

<class '__main__.B'>  # b is an instance of B
1   # showing the y attribute has been set.

最新更新