在 Python 中,将变量名(如self
)视为“指向”或“引用”值。当您创建以下实例时B
:
b = B(2)
使用已分配给 的早期实例的B.__init__
变量调用该方法。现在,在这个方法中,当 Python 到达self
B
self = A(x)
变量self
被重新分配给 的新实例A
。的实例B
仍然存在;self
只是不再指向它。
请注意,这self
是一个与 Python 中的任何其他变量一样的变量。(self
不是关键字,它只是调用方法的第一个参数的约定self
。)
顺便说一句,要self
使用 的值进行初始化x
,请使用
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 中的典型模式是使用类方法:
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
A
现在用 classmethod创建一个实例getA
,你会说
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()
B
那么您也可以创建使用类方法的实例getA
:
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.