В языке программирования Python свойства экземпляра класса не являются изолированными по умолчанию. Это означает, что любой экземпляр класса может получить доступ к свойствам других экземпляров, и изменения одного экземпляра могут отразиться на других.
Рассмотрим следующий пример:
class Person: def __init__(self, name): self.name = name person1 = Person("Alice") person2 = Person("Bob") print(person1.name) # Выводит "Alice" print(person2.name) # Выводит "Bob" person1.name = "Carol" print(person1.name) # Выводит "Carol" print(person2.name) # Выводит "Bob"
В этом примере у нас есть класс Person
, у которого есть свойство name
. Мы создаем два экземпляра этого класса: person1
с именем "Alice" и person2
с именем "Bob". Затем мы выводим их имена, которые соответственно выводятся как "Alice" и "Bob".
Однако, когда мы изменяем значение свойства name
для person1
и присваиваем ему значение "Carol", мы видим, что это изменение также отразилось на person1.name
. Это происходит потому, что оба экземпляра person1
и person2
ссылаются на одно и то же свойство name
.
Если мы хотим создать изолированные свойства экземпляров класса, мы можем объявить их как свойства класса, а не экземпляра класса. Для этого нам нужно использовать декоратор @property
перед методом, который будет возвращать значение свойства, и декоратор @<property_name>.setter
перед методом, который будет устанавливать значение свойства. Вот пример:
class Person: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, value): self._name = value person1 = Person("Alice") person2 = Person("Bob") print(person1.name) # Выводит "Alice" print(person2.name) # Выводит "Bob" person1.name = "Carol" print(person1.name) # Выводит "Carol" print(person2.name) # Выводит "Bob"
В этом примере мы объявляем свойство name
как свойство класса, используя декораторы @property
и @name.setter
. Теперь, когда мы изменяем значение свойства name
для person1
, это не отражается на person2
, так как у них теперь есть собственные изолированные свойства.
В заключение, свойства экземпляра класса в Python не являются изолированными по умолчанию, то есть изменения одного экземпляра могут отразиться на других. Однако, мы можем создать изолированные свойства, объявив их как свойства класса с использованием декораторов @property
и @<property_name>.setter
.