2014-01-03 4 views
2

Я знаю, что такое property/descriptor и decorator. Но мне трудно понять этот момент.поведение экземпляра свойства Python

class Person(object): 
    @property 
    def name(self, func): 
     pass 

    print("-- before setting -- ", name) 

    @name.setter # <---- what `name` object should be here 
    def name(self, v): 
     self._fn, self._ln = v.split(" ") 

    print("-- before getting -- ", name) 

    @name.getter # <---- and here 
    def name(self): 
     return self._fn + " " + self._ln 

    print("-- all done -- ", name) # <---- and here 

Descriptor - объект уровня класса. Таким образом, и @name.getter должны получить одинаковый объект дескриптора name. Когда я добавляю печати заявления после setter и getter, я получаю следующий результат:

('-- before setting -- ', <property object at 0x7fc1b0218f70>) # (a) 
('-- before getting -- ', <property object at 0x7fc1b0218fc8>) # (b) 
('-- all done -- ', <property object at 0x7fc1b0218f70>) #(c) 

(а) и (с) заявления имеют тот же объект, но property (б) не делает.

Может кто-нибудь объяснить мне, почему это или я что-то не хватает?

+0

Любая конкретная причина, по которой вы используете 'getter'? Это обычно не нужно; вы просто определяете получателя в первоначальном вызове '@ property'. – user2357112

+0

Я просто экспериментировал здесь. Я создал этот поддельный сценарий, чтобы понять мои сомнения. –

ответ

3

Это 3 разных объекта недвижимости; третий - это просто повторное использование памяти, выделенной для первой, поскольку первая была собрана. При использовании

@name.getter 

или

@name.setter 

декоратор возвращает новый объект свойства, отражающий поглотитель или сеттер вы определили, который затем связывается с именем функции вы определяете. Поскольку имя функции, которую вы определяете, это name, она заменяет прежнее свойство name.

1

Декораторы каждый день воссоздают объект недвижимости, комбинируя новую информацию с существующим свойством. То, что идентификаторы объектов одинаковы в (a) и (c), является совпадением.

Смежные вопросы