Используйте 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
не входит в какой-либо белый список.