Python从父类构造子类

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

最佳答案

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

关于Python从父类构造子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921258/

相关文章:

python - NLTK 的拼写检查器无法正常工作

python - 预测发生时准确性较差

c++ - 通过构造函数动态确定类实现

java - Java中重写接口(interface)而不是父类

python - 如何在 Django 中设置 ManyToMany 字段的值?

python - Celery 尝试将代理 URL 作为模块导入?

css - 我如何使用 Sass 给某些东西一个默认但可选的可覆盖值?

java - (Java downcasting) 这个例子我做错了什么?

python - 通过数据库的另一个函数调用函数中的变量

php - Doctrine 2 具体表继承与关联