将类A的实例存储在类B的实例中

时间:2019-01-17 14:11:11

标签: python oop

我有一个问题,更多是关于一般OOP的问题,而不是特定于python的问题。

可以在没有特定方法的情况下(即通过某种继承)将ClassA实例存储在ClassB实例中。

示例:假设我有一个Model class和一个Variable class

class Model():
    def __init__(self):
        self.vars = []

    def _update_vars(self,Variable):
        self.vars.append(Variable)

class Variable(Model):
    def __init__(self,**kwargs):
        self.__dict__.update(kwargs)

现在是否可以在创建变量实例时调用_update_vars

所以,如果我做这样的事情:

mdl = Model()
varA = Variable(...)
varB = Variable(...)

mdl.vars现在将包含varAvarB

我知道我可以通过将变量作为参数传递给Model的“ public”方法来轻松地做到这一点。所以我不是在找

mdl.update_vars(varA)

所以我的两个问题是:

  1. 这可能吗?
  2. 如果是:这种非常非标准的OOP编程吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

这不是类继承的工作方式。如果子类要在父类中使用大量的属性/方法,则只希望继承某些内容。如果子类的结构明显不同,则应该是其自己的类。

在任何一种情况下,如@jasonharper所述,在某些时候您都需要给出哪个Variable实例属于哪个Model实例的指示,因此您最终可能会像这样的东西:

varA = Variable(mdl, ...)
# or this
mdl.varA = Variable(...)

采用第一种方法,您将在Variable类中维护该方法:

class Foo:
    def __init__(self):
        self.vars = []

class Bar:
    def __init__(self, foo_instance, **kwargs):
        foo_instance.vars.append(self)

f = Foo()
b = Bar(f, hello='hey')
f.vars
# [<__main__.Bar object at 0x03F6B4B0>]

使用第二种方法,您可以在每次添加Variable实例之后将它们list添加到一个class Foo: def __init__(self): self.vars = [] def __setattr__(self, name, val): self.__dict__.update({name: val}) if not name == 'vars': # to prevent a recursive loop self.vars.append(val) f = Foo() f.vars # [] f.a = 'bar' f.vars # ['bar'] 中:

__dict__

当然,一种更简单的方法是每次需要vars时直接查看class Bar: @property def vars(self): # Or you can return .items() if you want both the name and the value return list(self.__dict__.values()) b = Bar() b.a = 'hello' b.vars # ['hello']

{{1}}

即使您为自己的类实例分配了属性,这两种方法都将起作用。

答案 1 :(得分:0)

您可以为此使用super()并将实例传递给父级

class Model():
    vars = []

    def __init__(self, other=None):
        if other:
            self.vars.append(other)


class Variable(Model):
    def __init__(self, a):
        self.a = a
        super().__init__(self)


mdl = Model()
varA = Variable(3)
varB = Variable(4)
print(mdl.vars)