Наследование без наследования, есть ли динамические атрибуты, которые указывают на другие переменные класса?

1



Я изо всех сил пытаюсь решить эту проблему.

Я хотел бы, чтобы переменная 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

Спасибо!

Теги:
inheritance
setattr

2 ответа

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 не указано в каком-либо белом списке.

  • 0
    Как я могу создать динамические свойства на основе атрибутов модели?
  • 0
    @AdrianoMuraca В примере кода уже показано динамическое свойство с использованием атрибутов Model . Пожалуйста, уточните, что вам нужно.
Показать ещё 3 комментария
1

Наряду с 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню