Использование @property в Python

задняя часть Python
Использование @property в Python

Эта статья участвовала в третьем этапе курса «High Yield Update» тренировочного лагеря для создателей Nuggets. Подробнее см.:Dig Li Project | Идет третий этап тренировочного лагеря создателя, «написание» личного влияния.

вводить

@propertyдаPythonОдин装饰器, используется для модификации метода.

1 роль

можно использовать@propertyдекоратор для созданиясвойство только для чтения, @ Декораторы недвижимости будутметодпреобразовано в то же имясвойство только для чтения, можно использовать вместе с определенным свойством, что предотвращает изменение свойства.

2 сценария использования

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

class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15
  def method_without_property(self): ##不含@property
      return 15

l = DataSet()
print(l.method_with_property) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
print(l.method_without_property())  #没有加@property , 必须使用正常的调用方法的形式,即在后面加()

Оба выводят 15.

class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15
l = DataSet()
print(l.method_with_property()) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。

При использовании свойства модифицировано и при вызове, после того, как способ добавляет (), он будет отображать сообщение об ошибке:

TypeError: 'int' object is not callable

То есть добавить@propertyПосле этого этот метод становится атрибутом, если () добавляется позже, он вызывается как функция, но не вызывается.

class DataSet(object):
  def method_without_property(self): ##不含@property
      return 15
l = DataSet()
print(l.method_without_property) #没有加@property , 必须使用正常的调用方法的形式,即在后面加()

Модификации свойства нет, это метод, если убрать круглые скобки, то адрес, по которому хранится метод, не будет выдаваться как ошибка.

2.2 Запретить изменение свойств

Поскольку нет возможности установить частные атрибуты, когда python определяет атрибуты, они должны быть установлены методом @property. Таким образом, имя атрибута может быть скрыто, чтобы пользователь не мог изменить его по своему желанию при его использовании.

class DataSet(object):
    def __init__(self):
        self._images = 1
        self._labels = 2 #定义属性的名称
    @property
    def images(self): #方法加入@property后,这个方法相当于一个属性,这个属性可以让用户进行使用,而且用户有没办法随意修改。
        return self._images 
    @property
    def labels(self):
        return self._labels
l = DataSet()
#用户进行属性调用的时候,直接调用images即可,而不用知道属性名_images,因此用户无法更改属性,从而保护了类的属性。
print(l.images) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。