我有两个类:基类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.