Доступ к атрибутам класса в языке Python
ООП на Python атрибуты класса Python, доступ к атрибутам класса Python, ооп Python атрибуты класса
Атрибуты созданного экземпляра класса можно добавлять, изменять или удалять в любое время, используя для доступа к ним точечную запись. Если построить инструкцию, в которой присвоить значение атрибуту, то можно изменить значение, содержащееся внутри существующего атрибута, либо создать новый с указанным именем и содержащий присвоенное значение:
имя-экземпляра.имя-атрибута = значение
del имя-экземпляра.имя-атрибута
Альтернативным способом добавления, изменения либо удаления переменной экземпляра является использование встроенных функций Python:
getattr(имя-экземпляра, 'имя-атрибута') - возвращает значение атрибута экземпляра класса;
hasattr(имя-экземпляра, 'имя-атрибута') - возвращает True, если значение атрибута существует в экземпляре, в противном случае возвращает False;
setattr(имя-экземпляра, 'имя-атрибута', значение) - модифицирует существующее значение атрибута либо создает новый атрибут для экземпляра;
delattr(имя-экземпляра, 'имя-атрибута') - удаляет атрибут из экземпляра.
Имена атрибутов, автоматически предоставляемые интерпретатором Python, всегда содержат символ подчеркивания, чтобы обозначить «частный» характер этих атрибутов — их не следует изменять либо удалять. Таким же образом вы можете добавить свои собственные атрибуты, обозначив их как «частные», но не забывайте, что они, как и все другие, могут быть изменены.
Допустим, у нас имеется следующий класс Bird:
class Bird:
count = 0
def __init__(self, say):
self.say = say
Bird.count += 1
def talk(self):
return self.say
1. Начните новую программу на Python, сделав доступными функции класса Bird, созданного в предыдущем примере.
from Bird import *
2. Затем создайте экземпляр класса, после чего добавьте, используя точечную запись, новый атрибут с присвоенным значением.
chick = Bird("Cheep, cheep!")
chick.age = "1 month"
3. Теперь выведите значения, хранящиеся в обоих атрибутах экземпляра.
print( '\nChick Says:' , chick.talk() )
print( 'Chick age:' , chick.age )
4. Измените новый атрибут с помощью точечной записи и выведите его новое значение.
chick.age = "2 month"
print( 'Chick Now:' , chick.age )
5. Опять измените новый атрибут, используя в этот раз встроенную функцию.
setattr(chick, 'age', '3 month')
6. После этого выведите список всех атрибутов экземпляра, не являющихся частными, и соответствующие им значения, используя встроенную функцию.
print( '\nChick Attributes...' )
for atttribute in dir( chick ):
if atttribute[0] != '_':
print( atttribute, ':', getattr( chick , atttribute ) )
Данный цикл пропускает все атрибуты, чьи имена начинаются с символа подчеркивания, так что «частные» атрибуты как __name__, __doc__ и т.п. не попадут в результирующий список.
7. Наконец удалите новый атрибут и проверьте его отсутствие, используя встроенные функции.
delattr(chick, 'age')
print( '\nChick age Attribute?' , hasattr( chick , 'age' ) )
Весь наш код выглядит следующим образом:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Bird:
count = 0
def __init__(self, say):
self.say = say
Bird.count += 1
def talk(self):
return self.say
chick = Bird('Cheep, cheep!')
chick.age = '1 month'
print('\nChick Says:', chick.talk())
print('Chick Age:', chick.age)
chick.age = '2 month'
print('Chick Now:', chick.age)
setattr(chick, 'age', '3 month')
print('\nChick Attributes...')
for attribute in dir(chick):
if attribute[0] != '_':
print(attribute, ':', getattr(chick, attribute))
delattr(chick, 'age')
print('\nChick age Attribute?', hasattr(chick, 'age'))
8. Сохраните файл в вашем рабочем каталоге, затем откройте командную строку и запустите программу — вы увидите результат обращения к атрибутам экземпляра.
Интересное видео по теме для читателей:
- Статические методы и методы класса
- Наследование. Объектно-ориентированное программирование в Python
- Абстрактные методы в Python
- Объектно-ориентированное программирование. Определение класса и создание экземпляра класса в Python
- Гибкое создание объектов в Python с помощью метода __new__
- Слоты и обобщенные инструмены в Python
- Альтернативы статическим методам Python