Python从父类构建子类

8

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

所以我可以使用A对象构建B对象。

你所说的“使用父实例”是什么意思?你是想创建一个继承关系(那就直接“使用继承”),还是一个组合关系(那当然可以让B拥有一个A实例属性)?能否给出一个更好地代表你尝试做的事情的非平凡示例? - jonrsharpe
你可能想要了解“角色”和“特征”。 - User
你想要:基于现有的 myA 创建一个类型为 B 的新实例吗?还是你想将现有的 myA “升级”为 B - Jamie Cockburn
1
我想要从我的A实例构建一个新的B实例。 - dijkstraman
3个回答

8
这将会按照您的要求执行,创建一个新的B,使用现有A的数据,然后完成新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是一个list,并且您执行了myA.a.append(value),那么myB.a中也会有value。如果您不希望出现这种情况,请将__dict__的赋值更改为:
self.__dict__ = deepcopy(args[0].__dict__)

注意:如果您正在使用插槽,则以下内容将无法工作,因为 __dict__ 不存在


2
谢谢你的回答,看起来在Python中并不那么容易,在C++中这与使用父类的复制构造函数相同,所以我认为在Python中这将是一种直观的方式。 - dijkstraman

0
你可以利用以下事实: 例如:
class A(object):
  pass

def CreateB(superclass):
  class subclass(superclass):
    pass
  return subclass

B = CreateB(A)
myA = A()
myB = B()

话虽如此,我并不完全清楚你试图解决的实际问题是什么。


我认为这不是动态声明一个新类,而是从一个 A 实例创建一个 B 实例。 - Jamie Cockburn
@JamieCockburn:你说得很有可能是对的,很难确定。问题本身也比较模糊。 - NPE
实际上,我并不是在批评你的回答! - Jamie Cockburn

-1
在你的例子中,类中的方法需要一个第一个参数来引用自己。通常这个参数被命名为self
class A:
    pass #class A code

class B(A):
    def __init__(self, a):
       self.super = a

myA = A()
myB = B(myA)

上面的代码将创建一个名为super的A实例的引用,并创建一个名为B的实例。如果你想让B继承A,那么你需要稍微修改一下代码。
class A:
    pass #class A code

class B(A):
    def __init__(self):
        A.__init__(self)

myA = A()
myB = B()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接