атрибут класса python - PullRequest
       11

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

15 голосов
/ 27 мая 2010

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

Результаты разные. Я также использую функцию id (), чтобы найти t2.derived_val и t2. class .derived_val имеют разные адреса памяти. Моя проблема является производным_val атрибут класса. Почему это отличается в приведенном выше примере? Это потому, что экземпляр класса копирует свой собственный output_val рядом с атрибутом класса?

Ответы [ 3 ]

37 голосов
/ 27 мая 2010

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

class base :
    derived_val = 1

Вы определяете атрибут класса. derived_val становится ключом в base.__dict__.

t2=base()
print(base.__dict__)
# {'derived_val': 1, '__module__': '__main__', '__doc__': None}
print(t2.__dict__)
# {}

Когда вы говорите t2.derived_val, Python пытается найти 'output_val' в t2.__dict__. Поскольку его там нет, он ищет, есть ли ключ 'derived_val' в любом из базовых классов t2.

print(t2.derived_val)
print(t2.__dict__)
# 1
# {}

Но когда вы присваиваете значение t2.derived_val, вы теперь добавляете атрибут экземпляра к t2. Клавиша derived_val добавлена ​​к t2.__dict__.

t2.derived_val = t2.derived_val+1
print(t2.derived_val)
print(t2.__dict__)
# 2
# {'derived_val': 2}

Обратите внимание, что на данный момент есть два derived_val атрибута, но только атрибут экземпляра легко доступен. Атрибут класса становится доступным только через ссылку base.derived_val или прямой доступ к классу dict base.__dict__.

2 голосов
/ 27 мая 2010

Проверьте это здесь и здесь .

Атрибут __class__ - это класс, к которому принадлежит объект. Так что в вашем примере ситуация похожа на статические переменные. t2.__class__.derived_val относится к переменной, которая принадлежит классу, а не к переменной, которая принадлежит t2.

1 голос
/ 21 октября 2015

Другой способ (возможно, более краткий), чтобы продемонстрировать это:

class A():
   a1 = []
x = A()
y = A()
x.a1.append("test")
x.a1, y.a1
(['test'], ['test'])

class B():
   b1 = None
   def __init__(self):
      self.b1 = list()
r = B()
s = B()
r.b1.append("test")
r.b1, s.b1
(["test"], [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...