Получить имя атрибута атрибута класса - PullRequest
0 голосов
/ 23 мая 2018

Вот два отдельных объекта:

class Field(object):
    pass

class MyClass(object):
    spam = Field()
    eggs = Field()
    potato = Field()

Для любого объекта Field существует ли для этого объекта способ узнать имя атрибута, присвоенное ему MyClass?

Я знаю, что мог бы передать параметры объекту Field, например potato = Field(name='potato'), но в моем случае это было бы грязно и утомительно, поэтому мне просто интересно, есть ли не ручной способ сделать то же самое.

Спасибо!

1 Ответ

0 голосов
/ 23 мая 2018

Да, вы можете сделать класс Field дескриптором , а затем использовать метод __set_name__ для привязки имени.В MyClass.

object.__set_name__(self, owner, name) особой обработки не требуется. Вызывается во время создания владельца класса-владельца.Дескриптору присвоено имя.

Этот метод доступен в Python 3.6 + .

>>> class Field:
...     def __set_name__(self, owner, name):
...         print('__set_name__ was called!')
...         print(f'self: {self!r}')  # this is the Field instance (descriptor)
...         print(f'owner: {owner!r}')  # this is the owning class (e.g. MyClass) 
...         print(f'name: {name!r}')  # the name the descriptor was bound to
... 
>>> class MyClass:
...     potato = Field()
... 
__set_name__ was called!
self: <__main__.Field object at 0xcafef00d>
owner: <class '__main__.MyClass'>
name: 'potato'
...