атрибут класса Python

у меня есть вопрос об атрибуте класса в 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 около атрибута класса?

17
задан chnet 27 May 2010 в 18:00
поделиться

2 ответа

Есть атрибуты класса и атрибуты экземпляра. Когда вы говорите

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 __ .

40
ответ дан 30 November 2019 в 11:12
поделиться

Посмотрите здесь и здесь .

Атрибут __ class __ - это класс, к которому принадлежит объект. Итак, в вашем примере ситуация аналогична статическим переменным. t2 .__ class __. Производное_val относится к переменной, которая принадлежит классу, а не к переменной, которая принадлежит t2.

2
ответ дан 30 November 2019 в 11:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: