Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 124

Еще один способ определить свойства — это декораторы. В следующем при-

мере мы определим два разных метода с именем name(), предшествовать которым

будут разные декораторы:

 @property, который размещается перед геттером;

 @name.setter, который размещается перед сеттером.

В коде они выглядят так:

>>> class Duck():

... def __init__(self, input_name):

... self.hidden_name = input_name

... @property

... def name(self):

... print('inside the getter')

Получаем и устанавливаем значение атрибутов с помощью свойств

167

... return self.hidden_name

... @name.setter

... def name(self, input_name):

... print('inside the setter')

... self.hidden_name = input_name

Вы все еще можете получать доступ к атрибуту name, но в этом случае не суще-

ствует видимых методов get_name() или set_name():

>>> fowl = Duck('Howard')

>>> fowl.name

inside the getter

'Howard'

>>> fowl.name = 'Donald'

inside the setter

>>> fowl.name

inside the getter

'Donald'

Если кто-то догадается, что мы называли наш атрибут hidden_name, он сможет считать

и записать его непосредственно с помощью конструкции fowl.hidden_name. В следующем

разделе вы увидите особый способ именования закрытых атрибутов в Python.

В обоих предыдущих примерах мы использовали свойство name, чтобы обратить-

ся к отдельному атрибуту (в нашем случае hidden_name), который хранится внутри

объекта. Свойство может ссылаться и на вычисляемое значение. Определим класс

Circle, который имеет атрибут radius и вычисляемое свойство diameter:

>>> class Circle():

... def __init__(self, radius):

... self.radius = radius

... @property

... def diameter(self):

... return 2 * self.radius

...

Мы создаем объект класса Circle, задав значение его атрибута radius:

>>> c = Circle(5)

>>> c.radius

5

Мы можем обратиться к свойству diameter точно так же, как к атрибуту вроде radius:

>>> c.diameter