我有一个问题更多地是关于 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)
所以我的两个问题是:
- 这可能吗?
- 如果是:这会是非常不标准的 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/