Это не так, как должно работать наследование классов. Вы хотите наследовать что-то, только если дочерний класс собирается использовать достаточное количество атрибутов / методов в родительском классе. Если дочерний класс имеет заметно отличающуюся структуру, он должен быть собственным классом.
В любом случае, как упомянуто @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']
Оба они будут работать одинаково, даже если вы присвоили атрибуты своим собственным экземплярам класса.