dij*_*man 6 python inheritance
我对python很陌生,有没有办法使用父实例构造子类?
嗯,我在想:
class A:
def __init__(self,a,b):
self.a = a
self.b = b
class B(A):
def __init__(self,A):
self.super = A
self.c = -1
def __init__(self,a,b,c):
super(a,b)
self.c = c
myA = A(1,2)
myB = B(myA)
Run Code Online (Sandbox Code Playgroud)
所以对于 B 对象,我可以使用 A 对象来构造它们。
这将按照您的要求执行,并B使用来自现有 的数据创建一个 new ,A然后完成 new 的初始化B:
class A(object):
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return "A: a = %s, b = %s" % (self.a, self.b)
class B(A):
def __init__(self, *args):
if type(args[0]) is A:
self.__dict__ = args[0].__dict__.copy()
c = args[1]
else:
super(B, self).__init__(*args[:2])
c = args[2]
self.c = c
def __str__(self):
return "B: a = %s, b = %s, c = %s" % (self.a, self.b, self.c)
Run Code Online (Sandbox Code Playgroud)
用法:
myA = A(1, 2)
print myA
print B(3,4,5) # regular B
myB = B(myA, 10) # B created from an A
print myB
Run Code Online (Sandbox Code Playgroud)
输出:
A: a = 1, b = 2
B: a = 3, b = 4, c = 5
B: a = 1, b = 2, c = 10
Run Code Online (Sandbox Code Playgroud)
请注意,新实例不会获得数据的新副本,而是获得对该数据的一组新引用。如果a是 alist而你做了myA.a.append(value),那么myB.a也会有value。如果您不希望出现这种情况,请将分配更改__dict__为:
self.__dict__ = deepcopy(args[0].__dict__)
Run Code Online (Sandbox Code Playgroud)
注意:如果您使用插槽,这些都不起作用,因为__dict__不存在