Python从父构造子类

时间:2014-07-23 21:22:23

标签: 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)

因此,对于拥有B对象,我可以使用A对象来构造它们。

3 个答案:

答案 0 :(得分:2)

这将按照您的要求执行,并使用现有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

请注意,新实例不会获取数据的新副本,而是获取对该数据的一组新引用。如果alist而您执行了myA.a.append(value),那么myB.a中也会有value。如果您不希望如此,请将__dict__的分配更改为:

self.__dict__ = deepcopy(args[0].__dict__)

注意:如果你使用的是插槽,这些都不会起作用,因为__dict__将不存在

答案 1 :(得分:0)

您可以利用以下事实:

例如:

class A(object):
  pass

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

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

那就是说,我并不完全清楚你要解决的实际问题是什么。

答案 2 :(得分:0)

在您的示例中,类中的方法需要第一个参数来引用它们自己。通常这被命名为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()