В чем разница между «свойством» и «атрибутом» Python?

Я вообще путаюсь о различии между «свойством» и «атрибутом» и не может найти большой ресурс, чтобы детализировать различия.

  • создавать и читать из tempfile
  • Свойства класса и __setattr__
  • Исправлено для python
  • Список файлов в ТОЛЬКО в текущем каталоге
  • Получение шести и шести модулей для автозаполнения в pycharm
  • Функции отправки на Python (PEP 443)
  • Найти путь из списка кортежей в Python
  • Как узнать, создал ли ndb.Model.get_or_insert новый объект или получил существующий?
  • 5 Solutions collect form web for “В чем разница между «свойством» и «атрибутом» Python?”

    Свойства – это особый вид атрибута. В основном, когда Python встречает следующий код:

    spam = SomeObject() print(spam.eggs) 

    он ищет eggs в spam , а затем проверяет eggs чтобы увидеть, есть ли у него __get__ , __set__ или __delete__ – если это так, это свойство. Если это свойство, вместо того, чтобы просто вернуть объект eggs (как и для любого другого атрибута), он __get__ метод __get__ (поскольку мы выполняем поиск) и возвращаем все возвращаемые методы.

    Дополнительная информация о модели и дескрипторах Python .

    С собственностью вы полностью контролируете свои методы получения, настройки и удаления, что у вас нет (если не использовать оговорки) с атрибутом.

     class A(object): _x = 0 '''A._x is an attribute''' @property def x(self): ''' Ax is a property This is the getter method ''' return self._x @x.setter def x(self, value): """ This is the setter method where I can check it's not assigned a value < 0 """ if value < 0: raise ValueError("Must be >= 0") self._x = value >>> a = A() >>> a._x = -1 >>> ax = -1 Traceback (most recent call last): File "ex.py", line 15, in <module> ax = -1 File "ex.py", line 9, in x raise ValueError("Must be >= 0") ValueError: Must be >= 0 

    В общем говоря, свойство и атрибут – одно и то же. Тем не менее, в Python есть декоратор свойств, который обеспечивает доступ к атрибуту (или другим данным) getter / setter.

     class MyObject(object): # This is a normal attribute foo = 1 @property def bar(self): return self.foo @bar.setter def bar(self, value): self.foo = value obj = MyObject() assert obj.foo == 1 assert obj.bar == obj.foo obj.bar = 2 assert obj.foo == 2 assert obj.bar == obj.foo 

    Свойство позволяет вам получать и устанавливать значения, как и обычные атрибуты, но под ним вызывается метод, переводящий его в getter и setter для вас. На самом деле это просто удобство в том, чтобы срубить планку вызова получателей и сеттеров.

    Например, например, у вас был класс, в котором были некоторые координаты x и y для чего-то необходимого. Чтобы установить их, вы можете сделать что-то вроде:

     myObj.x = 5 myObj.y = 10 

    Это гораздо легче смотреть и думать, чем писать:

     myObj.setX(5) myObj.setY(10) 

    Проблема в том, что если в один прекрасный день ваш класс изменится так, что вам нужно будет компенсировать ваши x и y какой-то ценностью? Теперь вам нужно будет войти и изменить определение класса и весь код, который его вызывает, что может быть очень трудоемким и подверженным ошибкам. Свойство позволяет использовать прежний синтаксис, давая вам гибкость изменения последнего.

    В Python вы можете определить методы getters, seters и delete с помощью функции property. Если вы просто хотите свойство read, есть также декоратор @property, который вы можете добавить выше своего метода.

    http://docs.python.org/library/functions.html#property

    Я узнал 2 отличия от сайта Бернд Клейн, вкратце:

    1. Свойство – более удобный способ инкапсуляции данных.

    ex: Если у вас есть длина атрибута public объекта Object, в дальнейшем ваш проект требует, чтобы вы инкапсулировали его, то есть: изменили его на private и предоставили getter и setter => вам нужно изменить многие из кодов, которые вы написали раньше:

     #Old codes obj1.length=obj1.length+obj2.length #New codes(Using private attibutes and getter and setter) obj1.set_lenght(obj1.get_length()+obj2.get_length()) #=> this is ugly 

    Если вы используете @property и @ lenght.setter =>, вам не нужно менять эти старые коды

    2. Свойство может инкапсулировать несколько атрибутов

     class Person: def __init__(self, name, physic_health, mental_health): self.name=name self.__physic_health=physic_health #physic_health is real value in range [0, 5.0] self.__mental_health=mental_health #mental_health is real value in range [0, 5.0] @property def condition(self): health=self.__physic_health+self.__mental_health if(health<5.0): return "I feel bad!" elif health<8.0: return "I am ok!" else: return "Great!" 

    В этом примере __physic_health и __mental_health являются частными и не могут быть доступны непосредственно извне, единственный способ взаимодействия с внешним классом – это свойство свойства cant

    Python - лучший язык программирования в мире.