我有一个问题,更多是关于一般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
现在将包含varA
和varB
。
我知道我可以通过将变量作为参数传递给Model的“ public”方法来轻松地做到这一点。所以我不是在找
mdl.update_vars(varA)
所以我的两个问题是:
感谢您的帮助!
答案 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)