2016-09-14 3 views
0

Следующий код является примером:«Необъявленная переменная» декларация в питона

class A(object): 
    def f(self): 
     pass 
A.f.b = 42 

Как эта переменная выделяется? Если я объявляю переменные A.f.a, A.f.b и A.f.c, я создаю 3 разных объекта A? Может ли кто-нибудь объяснить, что происходит в памяти (поскольку это не похоже на что-то, легко кодируемое на C)?

+1

Вы проверили этот код? вы не можете добавить член к функции. Но вы можете сделать 'A.b = 42', что добавит переменную класса в' A'. –

+5

Да, вы можете. Вы добавляете атрибуты к связанной функции 'f'. – IanAuld

+0

@IanAuld: казалось бы, что это может сработать, но не так: 'Afb = 42 AttributeError: объект instancemethod не имеет атрибута 'b'' –

ответ

0

Следующая работает только в Python 3:

class A(object): 
    def f(self): 
     pass 
A.f.a = 41 
A.f.b = 42 
A.f.c = 43 

A.f является объектом типа function, и вы всегда можете добавить новые атрибуты к function объекта , Не созданы экземпляры A; три атрибута ссылаются на функцию f.

Если у вас было два экземпляра a1 = A() и a2 = A(), однако, ни a1.f.b и a2.f.b не определены, поскольку a1.f не является ссылкой на A.f; это ссылка на объект типа method. Это связано с тем, как протокол дескриптора Python используется для реализации методов экземпляра.

0

A.b = 42 добавляет переменную класса в A, и тем самым делает его видимым мгновенно для каждого экземпляра A (но только 1 запись в память)

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

class A: 
    b = 12 

Но для быстрых «расширений» классов или экземпляров вы можете выбрать их динамическое добавление.

например:

class A(object): 
    pass 

a = A() 
print('b' in dir(a)) # False 
A.b = 42 
print('b' in dir(a)) # True even if instanciated before creation of `b` 
Смежные вопросы