у меня есть вопрос об атрибуте класса в Python.
class base :
def __init__ (self):
pass
derived_val = 1
t1 = base()
t2 = base ()
t2.derived_val +=1
t2.__class__.derived_val +=2
print t2.derived_val # its value is 2
print t2.__class__.derived_val # its value is 3
Результаты отличаются. Я также использую идентификатор (), функция для нахождения t2.derived_val и t2.class.derived_val имеет другой адрес памяти. Моей проблемой является derived_val, атрибут класса. Почему это отличается в вышеупомянутом примере? Это, потому что экземпляр класса копирует свой собственный derived_val около атрибута класса?
Есть атрибуты класса и атрибуты экземпляра. Когда вы говорите
class base :
derived_val = 1
, вы определяете атрибут класса. производное_значение
становится ключом в
base .__ dict __
.
t2=base()
print(base.__dict__)
# {'derived_val': 1, '__module__': '__main__', '__doc__': None}
print(t2.__dict__)
# {}
Когда вы говорите t2.dehibited_val
Python пытается найти «производное_значение» в t2 .__ dict __
. Поскольку его там нет, он проверяет, есть ли ключ 'производное_значение'
в любом из базовых классов t2
.
print(t2.derived_val)
print(t2.__dict__)
# 1
# {}
Но когда вы присваиваете значение t2.dehibited_val
, вы теперь добавляете атрибут экземпляра в t2
. Ключ производное_значение
добавляется к t2 .__ dict __
.
t2.derived_val = t2.derived_val+1
print(t2.derived_val)
print(t2.__dict__)
# 2
# {'derived_val': 2}
Обратите внимание, что на данный момент есть два атрибута производное_значение
, но только
атрибут экземпляра легко доступен. Атрибут класса становится доступным только через ссылку base.dehibited_val
или прямой доступ к классу dict base .__ dict __
.
Атрибут __ class __
- это класс, к которому принадлежит объект. Итак, в вашем примере ситуация аналогична статическим переменным. t2 .__ class __. Производное_val
относится к переменной, которая принадлежит классу, а не к переменной, которая принадлежит t2.