2015-05-04 7 views
2

Я не новичок в python, но у меня есть довольно простой вопрос.Что такое объект недвижимости?

Я играл вокруг с питоном и обнаружил, что есть свойство

>>> property 
<type 'property'> 

типа Но я только слышал о свойствах в контексте функции.

>>> a = property() 
<property object at 0x0246C090> 

А как насчет объектов недвижимости? Что они используют? Методы собственности не очень интуитивные или наводящие на размышления

>>> dir(a) 
['__class__', '__delattr__', '__delete__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'deleter', 'fdel', 'fget', 'fset', 'getter', 'setter'] 

Благодарим за внимание!

ответ

3

Объект property - это то, что вы на самом деле считаете собственностью. Рассмотрим следующий пример:

class Foo(object): 
    def __init__(self): 
     self._bar = 0 

    @property 
    def bar(self): 
     return self._bar + 5 

Foo.bar является свойство объекта, который имеет метод __get__. Когда вы пишете что-то вроде

x = Foo() 
print(x.bar) 

что поиск для x.bar находит, что type(x).bar имеет метод __get__, и поэтому поиск атрибут становится эквивалентным

type(x).bar.__get__(x, type(x)) 

, которая производит значение x._bar + 5.

Использование property в качестве декоратора несколько скрывает тот факт, что bar является объектом property. Эквивалент Defintion является

class Foo(object): 
    def __init__(self): 
     self._bar = 0 

    bar = property(lambda self: self._bar + 5) 

, который показывает более явно, что вы создаете property объект с данным lambda выражения как геттер для этого свойства, и связывание объекта с атрибутом класса bar.

property класса (наряду с методами, например, методами класса и статическими методами) представляет собой конкретное применение общего протокола дескриптора Python, который определяет поведение класса атрибутов с __get__, __set__, и/или __del__ методы.

1

Свойство - это объект атрибута, содержащий метод получения и метод setter.

+1

В принципе, с этой нотацией вы избегаете обозначения декоратора. –

+3

Это не объясняет, какие свойства на самом деле делают. – user2357112

2
class MyClass: 
    def __init__(self,*costs): 
     self.costs = costs 
    def item_cost(self): 
     return sum(self.costs) 

теперь вы можете сделать

MyClass(1,2,3,4).item_cost() #prints 10 

, но мы можем сделать это свойство

class MyClass: 
    def __init__(self,*costs): 
     self.costs = costs 
    @property 
    def item_cost(self): 
     return sum(self.costs) 

и теперь мы можем получить доступ к нему, как простой переменной

MyClass(1,2,3,4).item_cost 

вам также может создать сеттер для значения wit ч

... 
    @item_cost.setter 
    def set_item_cost(self,value): 
     pass #do something with value 
    ... 
MyClass(1,2,3,4).item_cost = "yellow" 

В общем, я нахожу их рода анти-модель ... но некоторые люди, как эм

(примечание стороны вы можете также сделать это свойство, используя его в качестве регулярной функции вместо декоратора MyClass.item_cost_prop = property(MyClass.item_cost))

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