экземпляр .__ dict__ & класс .__ dict__ - PullRequest
3 голосов
/ 11 октября 2011

Код идет первым:

class A(object):
    def foo(self):
        self.foo = 'foo'
    def bar(self):
        self.bar = 'bar'

cls_dict = dict(A.__dict__)  #not empty

a = A()
a_dict = dict(a.__dict__)  #empty, why?

Ответы [ 2 ]

8 голосов
/ 11 октября 2011

В Python все является объектом, содержащим атрибуты. Это включает сами классы . Вся объектно-ориентированная вещь с классами, которые определяют методы и экземпляры, которые могут выполнять эти методы с изменяющимися данными для каждого экземпляра, - это просто протокол для поиска атрибутов в серии объектов.

class A(object):
    def foo(self):
        self.foo = 'foo'
    def bar(self):
        self.bar = 'bar'

Создает объект класса, связанный с именем A. Этот объект содержит два атрибута foo и bar, каждый из которых связан с объектами метода.

a = A()

Это создает объект, связанный с именем a, который является экземпляром A. Пока не содержит никаких атрибутов. Но тот факт, что это экземпляр A, означает, что «протокол поиска», когда вы запрашиваете a.foo, заключается в том, чтобы сначала искать атрибут на a, а затем, если это не удается, искать атрибут на A. Вот как все экземпляры A могут обращаться к одному и тому же набору методов.

В Python вы также можете создавать атрибуты (почти) любого объекта в любое время. Все, что требуется, это some_object.some_attribute = some_value. Пока вы не сделаете это, атрибут не существует. Таким образом, при фактическом вызове a.foo() или a.bar() эти атрибуты foo и bar не существуют в a (равно как и никакие другие атрибуты, которые ваша программа однажды может добавить или не добавить в этот объект), почему a.__dict__ пусто в том месте, где вы его назвали. Если вы ожидаете, что значения по умолчанию foo и bar существуют для каждого объекта, вы должны сказать это, установив эти значения в методе __init__.

0 голосов
/ 11 октября 2011

a.__dict__ пусто, потому что ни один из атрибутов не был инициализирован в экземпляре, так как не определено __init__(). Между тем, класс является объектом, и он инициализировал некоторые атрибуты.

>>> A
<class '__main__.A'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...