从子类中已经构造的父类继承属性

时间:2019-03-18 12:41:43

标签: python class inheritance

关于类继承,我一直停留在这一点上,但是我还没有想出一种干净的方法。我有一些基础课:

class Foo:
    """ Parent class. """

    def __init__(self,a,b):
        self.a = a
        self.b = b

    def product(self):
        return self.a * self.b

此类包含我从某些数据文件中加载的信息。我想使用类属性来存储与该数据相关的各种信息。例如,如果我想创建一个报告来告诉我a和b的商,我想创建类似以下内容的

class Bar(Foo):
    """ Child class. """

    def __init__(self,foo_object):

        # What I want to avoid:
        self.a = foo_object.a
        self.b = foo_object.b

    def quotient(self):
        return self.a / self.b

很明显,在我的实际应用程序中还有更多的类属性。将Foo对象的所有属性分配到新的Bar对象变得非常繁琐。

一旦创建了Foo对象,是否有一种更优雅的方法将Foo对象“扩展”为Bar对象?

编辑:

对不起,如果我没有足够清楚地陈述我的目标;我发现我的要求有些困惑。我已经创建了具有许多属性的Foo对象。我想创建一个名为Foo的子类,称为Bar, later ,其中包含这些属性以及一些特定于我的应用程序“区域”的其他属性。

因此,我希望能够传递一个已经实例化的Foo对象,并将其属性值传递到Bar中相同的属性中,而无需逐个手动进行操作。

我相信Flob的答案就是我想要的。谢谢!

4 个答案:

答案 0 :(得分:0)

我不确定我“一旦创建Foo对象就意味着什么”。

要初始化由父类定义的属性,请使用以下方法:

class Bar(Foo):
    """ Child class. """

    def __init__(self,a,b):
        super().__init__(a,b)

    def quotient(self):
        return self.a / self.b

让超类的__init__()方法继续执行初始化ab的工作。

请注意,b = B()仅创建一个对象,而不是两个。


在您发布的代码中,Bar.__init__()似乎将Foo对象作为其参数之一。从技术上讲,这是在一个Foo对象中包装一个Bar对象的情况-如果您这样做,实际上就不需要{{1} }成为Bar的子类:

Foo

答案 1 :(得分:0)

可以在创建对象后更改其类别。不用将对象的内容拆包成一个新的对象,而是更改它用于查找方法的类:

class Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

class Bar(Foo):
    def quotient(self):
        return self.a/self.b

f = Foo(1, 2)
f.__class__ = Bar
f.quotient()  # 0.5

这通常不是必需的(我不建议在这里使用它)。相反,您可以直接创建一个Bar对象:

b = Bar(1, 2)
b.quotient()

Bar继承了__init__的{​​{1}}方法,因此您不必重新定义它。

另一种选择是使用不是方法的函数:

Foo

现在,即使您的def quotient(obj): return obj.a/obj.b 对象不知道quotient(Foo(1,2))函数,您也可以计算Foo

答案 2 :(得分:0)

一个类可以从基类继承,但是一个对象不能从另一个对象继承。它可以是副本(可能带有其他属性),也可以包装原始对象。第一种情况是真正的继承策略(子实例必须成为基类的实例,并且必须自行初始化),第二种情况是聚合或包含策略。

但是请注意,第二个注意事项,主要是因为 child 对象不是基类的实例(isinstance(child, Foo)为假)。这意味着这里没有一个合适的大小,您将不得不选择一种模式,即继承还是聚合。

答案 3 :(得分:0)

您可以通过在子类内部启动父类来直接继承信息。创建父类的实例后,可以使用vars(object)访问其所有属性,这将返回一个与该对象相关的所有属性的字典。例如,假设您有一个Foo类:

class Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

test_parent是此类的实例。

test_parent = Foo(a='Hello', b='World')

现在,在创建Bar子类时,请执行以下操作:

class Bar(Foo):
    def __init__(self, foo_object):
        a, b = vars(foo_object).values()  #get all properties of parent class object
        Foo.__init__(self, a, b)  # initiate parent class
    def say_hello(self):
        print('{} {}'.format(self.a, self.b))

创建Bar类的实例并调用say_hello

test_child = Bar(test_parent)
test_child.say_hello()

输出:

"Hello World"