gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:17 27 4
gpt4 key购买 nike

我有一个问题更多地是关于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com