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

标签 python oop

我有一个问题更多地是关于 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 现在将包含 varAvarB

我知道我可以通过将变量作为参数传递给 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']

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

关于python - 将类 A 的实例存储在类 B 的实例中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54237763/

相关文章:

python - 在 Spyder 中调试 Python 脚本(带标志)

python - 根据条件分配值

javascript - 我可以从嵌套对象创建新的 Javascript 对象吗?

java - 他们在 java 中说 "every thing is an object"。真的吗?

Python NoneType 对象未按预期工作

python - python 地板除法运算符是如何实现的?

python - Microsoft Graph API CalendarView 请求不起作用

iOS,跟踪在弹出 View 中上传和下载文件

oop - 如果我的域名有破折号,我应该如何制作我的包?

objective-c - 为 C 程序员学习 OO