В первом примере a
и b
являются атрибутами объекта класса C.(Представьте себе «статические» атрибуты.) И x
и y
являются атрибутами экземпляров C.(Итак, обычные атрибуты экземпляра.)
Во втором примере все четыре являются атрибутами C, а не его экземпляров.
В Python вы не можете «объявлять» атрибуты, как определеноопределенным классом, что означает, что нет никаких определений атрибута, чтобы унаследовать для начала.(Более или менее, но я не собираюсь запутывать воду, вводя __slots__
).Определения методов можно найти, выполнив поиск по имени «def method_name (»), а определения методов наследуются, как и в большинстве языков OO.
Смущает, что вы можете обращаться к атрибутам класса через экземпляры классазатем, если вы назначите новое значение этому атрибуту, будет создан новый атрибут экземпляра:
In [1]: class C(object): a=1
In [2]: c1 = C()
In [3]: c1.a
Out[3]: 1
In [5]: c1.__dict__
Out[5]: {}
In [6]: c1.a=2
In [7]: c1.__dict__
Out[7]: {'a': 2}
In [8]: c2 = C()
In [9]: c2.a
Out[9]: 1
, который позволяет вам давать значения атрибута экземпляра по умолчанию с помощью атрибутов класса. Я не думаю, что это оченьхотя обычное дело - я предпочитаю использовать значения по умолчанию для __init__()
аргументов.