Я изо всех сил пытаюсь решить эту проблему.
Я хотел бы, чтобы переменная name была как указатель на значение self.model.name. Если значение _class.model.name изменено, значение _class.name должно соответствующим образом измениться.
Невозможно найти способ динамически сопоставлять атрибуты Class с любыми атрибутами модели без наследования.
class Model(object):
name = 'foo'
parent = 'foo_p'
class Class(object):
model_class = Model
def __init__(self):
self.model = self.model_class()
setattr(self, 'name', self.model.name)
_class = Class()
print _class.model.name # foo
_class.model.name = 'foo_1'
print _class.name # this should be foo_1
Спасибо!
Используйте property
для создания отдельных динамически вычисляемых атрибутов:
class Class(object):
_model_class = Model
@property
def name(self):
return Class._model_class.name
Это заставляет все экземпляры Class
запускать метод name
всякий раз, когда name
атрибута просматривается. Это позволяет динамически вычислять значение для каждого поиска.
_class = Class()
print(_class.name) # 'foo'
Model.name = 'bar'
print(_class.name) # 'bar'
Если вы хотите динамически извлекать многие или все атрибуты из другого места, подумайте об использовании __getattr__
:
class Class(object):
_model_class = Model
def __getattr__(self, name):
# name is a *string* containing the name of the attribute to fetch
return getattr(Class._model_class, name)
__getattr__
запускается только для атрибутов, которые не относятся к классу/экземпляру. Это делает его довольно простым для использования с определенными вручную атрибутами. Обратите внимание, что вы можете использовать произвольный код для ограничения того, что выбрано - например, повышать AttributeError
если name
не указано в каком-либо белом списке.
Наряду с MisterMiyagi ответьте - но в случае, если вы хотите по-прежнему хотеть, чтобы проблемы были разделены (хотя это действительно не похоже на то, что вы делаете)
class Class(object):
model_class = Model
def __init__(self):
self.model = self.model_class()
setattr(self, 'name', self.model.name)
# This is what we'll be changing
@property
def model_name(self):
return self.model.name
# This method will get called whenever we change the model_name
@model_name.setter
def model_name(self, new_name):
self.model.name = new_name
self.name = new_name
_class = Class()
_class.model_name # foo
_class.model_name = "bar" # both _class.model.name == bar and _class.name == bar now
Model
. Пожалуйста, уточните, что вам нужно.