Уведомления

Группа в Telegram: @pythonsu

#1 Май 26, 2012 02:36:26

vkopey
От:
Зарегистрирован: 2010-09-26
Сообщения: 116
Репутация: +  3  -
Профиль   Отправить e-mail  

Атрибуты класса

# -*- coding: utf-8 -*-
class A:
    a=0
class B(A):
    b=0
A.a=1
print A.__dict__
print B.__dict__ # почему здесь нет 'a' ?
print dir(B) # а здесь 'a' есть
print B.a # почему a=1 ?



Офлайн

#2 Май 26, 2012 09:17:05

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Атрибуты класса

vkopey
print B.__dict__ # почему здесь нет ‘a’ ?
Потому что a - это атрибут класса A и его нет в B.__dict__.
vkopey
print dir(B) # а здесь ‘a’ есть
print B.a # почему a=1 ?
Атрибуты базовых классов берутся в порядке MRO.
Т.е. в классах старого стиля есть атрибут __bases__, в новых классах (унаследованных от object) есть __mro__. Если атрибут не нашелся в B, они ищется выше по иерархии.

Еще:
B.a = 2 # теперь B.a - атрибут B
print A.a # 1
print B.__dict__ # {... 'a': 2}
# и присваивание атрибуту базового класса значения
A.a = 3
# не влияет на B
print B.a # 2

Вот еще для размышлений о затенении атрибутов класса атрибутами экземпляра: http://stackoverflow.com/a/69067/1052325

Отредактировано reclosedev (Май 26, 2012 09:19:06)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version