Skip to main content
 首页 » 编程设计

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

2025年05月04日20xxx_UU

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

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

示例:假设我有一个模型类和一个变量类

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 现在将包含 varA 和 varB。

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

mdl.update_vars(varA)

所以我的两个问题是:

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

感谢您的帮助!

请您参考如下方法:

这不是类继承的工作方式。如果子类要使用父类中的大量属性/方法,您只想继承一些东西。如果子类具有明显不同的结构,则它应该是自己的类。

在任何一种情况下,正如@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'] 

当然,更简单的方法是在每次需要 vars 时直接查看 __dict__:

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'] 

即使您使用自己的类实例分配属性,这两者的工作方式相同。