在构造之后在子类中实例化基类

时间:2016-12-15 18:22:52

标签: python

假设我有一个A类:

class B(A):
 def __init(self,x,y,p,q):
  A.__init__(self,x,y)
  self.p=p
  self.q=q

现在,让B继承自A:

ex1 = B(x1,y1,p1,q1)

让ex1成为B的实例:

exA = A(x2,y2)

#something like...
ex1.A = exA

#..so that
print(ex1.x) #yields x2
print(ex1.y) #yeilds y2

是否有一种优雅的方法来创建A的实例并将其属性分配给B?这样

{{1}}

2 个答案:

答案 0 :(得分:1)

没有“复制构造函数”这样的东西,如果这就是你所得到的 - 你不能在python中重载=。但是你可以在B类中轻松定义一个函数:

def fromA(self,someA):
    self.x = someA.x
    self.y = someA.y

现在ex1.fromA(exA)会做你想要的。您也可以在A本身中定义它,可能更有意义。如果您确实在AB中定义了它,那么您可以在init中使用它,如果您愿意:

def __init__(self,p,q,someA):
    self.fromA(someA).
    self.p = p
    self.q = q

编辑如果你想要复制父类的所有属性,那么在父类中放置:

def fromA(self,someA):
    for att in someA.__dict__:
        self.__dict__[att] = someA.__dict__[att]

如果您在init之外添加内容,则需要尝试将其包含在内,以确保该属性存在于当前对象中。

答案 1 :(得分:1)

您可以为B编写一个以A作为参数的类方法。

class B(A):
    def __init(self, x, y, p, q):
        A.__init__(self, x, y)
        self.p = p
        self.q = q

    @classmethod
    def fromA(cls, A, p, q):
        return cls(A.x, A.y, p, q)

现在你可以做到:

exA = A(x2,y2)
exB = B.fromA(exA, p1, q1)

print(exB.x) #yields x2
print(exB.y) #yeilds y2