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 =

我对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)

因此,对于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
到a
B
?我想从myA(a的实例)构造一个新的B实例。我不认为这是动态声明一个新类,而是获取一个
a
实例并从中创建一个
B
实例。@JamieCockburn:你可能是对的,很难确定。这个问题相当模糊。事实上,我并不是真的批评你的答案!谢谢你的回答,看起来它在Python中不是那么容易,在C++中,这和使用父类的复制构造函数是一样的,所以我认为在Python中我会是一个直觉的方法。