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