Основные тезисы
1. Переменная экземпляра - это свойство, существование которого зависит от создания объекта. У каждого объекта может быть свой набор переменных экземпляра.
Более того, их можно свободно добавлять и удалять из объектов в течение их жизни. Все переменные экземпляра объекта хранятся в специальном словаре с именем __dict__
, который содержится в каждом объекте отдельно.
2. Переменная экземпляра может быть скрытой, если ее имя начинается с __
, но не забывайте, что такое свойство по-прежнему доступно извне класса с использованием искаженного имени, созданного как _ClassName__PrivatePropertyName
.
3. Переменная класса - это свойство, которое существует ровно в одной копии, и для доступа к нему не требуется никаких созданных объектов. Такие переменные не отображаются как содержимое __dict__
.
Все переменные класса класса хранятся в специальном словаре с именем __dict__
, который содержится в каждом классе отдельно.
4. Функция с именем hasattr()
может быть использована для того, чтобы определить, содержит ли объект/класс определенное свойство.
Например:
class Sample:
gamma = 0 # Class variable.
def __init__(self):
self.alpha = 1 # Instance variable.
self.__delta = 3 # Private instance variable.
obj = Sample()
obj.beta = 2 # Another instance variable (existing only inside the "obj" instance.)
print(obj.__dict__)
Код выводит:
{'alpha': 1, '_Sample__delta': 3, 'beta': 2}
output
Упражнение 1
Какие свойства класса Python
являются переменными экземпляра, а какие - переменными класса? Какие из них скрытые?
class Python:
population = 1
victims = 0
def __init__(self):
self.length_ft = 3
self.__venomous = False
Упражнение 2
Вы собираетесь присвоить обратное значение свойству __venomous
объекта version_2
, игнорируя тот факт, что свойство является скрытым. Как Вы это сделаете?
version_2 = Python()
Упражнение 3
Напишите выражение, которое проверяет, содержит ли объект version_2
свойство экземпляра с именем constrictor
(да, constrictor!).