Python从父类构造子类

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 对象来构造它们。

Jam*_*urn 6

这将按照您的要求执行,并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__不存在

  • 感谢您的回答,看起来在 python 中并不那么容易,在 c++ 中这与使用父类的复制构造函数相同,所以我认为在 python 中我将是一种直观的方法。 (2认同)