Предположим, у нас есть базовый класс A
, который содержит некоторые переменные класса. Этот класс также имеет метод класса foo
, который делает что-то с этими переменными. Поскольку это поведение не должно быть жестко запрограммировано (например, нам не нужно изменять foo
при добавлении новых переменных класса), foo
читает cls.__dict__
вместо прямой ссылки на переменные.
Теперь мы представляем производный класс: B
расширяет A
еще несколькими переменными класса, а также наследует foo
. Пример кода:
class A:
x = 0
y = 1
@classmethod
def foo(cls):
print([name for name, prop in cls.__dict__.items() if type(prop) is int])
class B(A):
z = 3
print(B.x) # prints "0"
A.foo() # prints "['x', 'y']"
B.foo() # prints "['z']" -- why not "['x', 'y', 'z']"?
Поэтому мой вопрос таков: почему B.__dict__
не содержит переменных, унаследованных от A
, и если их там нет, то где они находятся?
Это не дубликат Доступ к атрибутам класса от родителей в методах экземпляра , потому что я не просто хочу запрашивать конкретные переменные, которые находятся в базовом классе - Я хочу перечислить их , не зная их имен. Ответы, относящиеся к MRO, приведенные в этом вопросе, также могут быть применимы и здесь, но первоначальная проблема, на мой взгляд, другая.