Python从父类构造子类
我对python很陌生,有没有一种方法可以使用父实例构造子类 我在想:Python从父类构造子类,python,inheritance,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 =
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)
因此,对于B对象,我可以使用A对象来构造它们。您可以利用以下事实:
是一个可执行语句李>class
- 课程是
class A(object):
pass
def CreateB(superclass):
class subclass(superclass):
pass
return subclass
B = CreateB(A)
myA = A()
myB = B()
也就是说,我并不完全清楚您试图解决的实际问题是什么。在您的示例中,类中的方法需要第一个参数来引用它们自己。通常这被命名为
self
class A:
pass #class A code
class B(A):
def __init__(self, a):
self.super = a
myA = A()
myB = B(myA)
上面的代码将创建一个B实例,引用一个名为super的a实例。如果您希望B从A继承,那么您将稍微修改代码
class A:
pass #class A code
class B(A):
def __init__(self):
A.__init__(self)
myA = A()
myB = B()
这将按照您的要求执行,并使用现有
a
中的数据创建一个新的B
,然后完成新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)
用法:
myA = A(1, 2)
print myA
print B(3,4,5) # regular B
myB = B(myA, 10) # B created from an A
print myB
输出:
A: a = 1, b = 2
B: a = 3, b = 4, c = 5
B: a = 1, b = 2, c = 10
请注意,新实例不会获取数据的新副本,而是获取对该数据的一组新引用。如果a
是一个列表
,并且您执行了myA.a.append(value)
,那么myB.a
中也会包含value
。如果不希望出现这种情况,请将\uuuu dict\uuu
的赋值更改为:
self.__dict__ = deepcopy(args[0].__dict__)
注意:如果您使用的是插槽,则所有这些都不起作用,因为
\uuuu dict\uuuu
将不存在您所说的“使用父实例”是什么意思?您是在尝试创建继承关系(然后只使用继承)还是组合关系(当然B
可以有一个a
实例的属性)?您能否给出一个更能代表您正在尝试做的事情的非平凡示例?您可能希望了解“角色”和“特征”。您是否希望:基于现有的myA
,创建一个类型为B
的新实例?或者你想“升级”现有的myA
到aB
?我想从myA(a的实例)构造一个新的B实例。我不认为这是动态声明一个新类,而是获取一个a
实例并从中创建一个B
实例。@JamieCockburn:你可能是对的,很难确定。这个问题相当模糊。事实上,我并不是真的批评你的答案!谢谢你的回答,看起来它在Python中不是那么容易,在C++中,这和使用父类的复制构造函数是一样的,所以我认为在Python中我会是一个直觉的方法。