Мы говорим, что classes
являются изменяемыми в Python, что означает, что вы можете использовать ссылки, которые мы можем изменить значения, которые будут отражаться в объекте. Например,Почему я не могу изменить атрибут класса в Python
>>> A = [1, 2, 3]
>>> B = A
>>> B[2] = 5
>>> A
[1, 2, 5]
Здесь можно изменить значения A
объекта с помощью B
, потому что list
является изменяемым типом. Мой вопрос, почему я не могу изменить атрибуты класса ниже, с использованием той же концепции:
class C:
apple = 2
def __init__(self):
self.dangerous = 2
D = C# D is pointing to same class C
D().dangerous = 5 # changing the value of class attribute D
D().apple = 3 # changing the value of apple here
print D().apple
print D().dangerous
OUTPUT:
2
2
Может кто-нибудь объяснить, почему выход 2
и 2
но не 3
и 5
, так как мы говорим, что класс является mutable
type.
ОБНОВЛЕНИЕ: Обращаясь к ответу @ zxq9, если вы видите приведенную ниже диаграмму, когда D=C
, D
фактически указывает на тот же класс, а на новый объект, как вы описали. Не могли бы вы объяснить это:
Что в мире люди downvoting это? ОП задал довольно четкий вопрос, просто не понимал синтаксической разницы между экземплярами объектов и определениями классов. – zxq9
@ zxq9 Можете ли вы увидеть мой обновленный pic? – python
Да, но * вы все еще только назначаете временный экземпляр класса *, а не сам класс. Я буду играть с этим и расширить свой ответ, чтобы покрыть это. Это очень хорошая вещь, чтобы иметь в виду Python. – zxq9