Тело класса выполнено точно так же, как функция, и локальное пространство имен затем превращается в атрибуты класса.
Как правило, применяются нормативные требования к порядку именования; вы не можете ссылаться на get_username()
, потому что это не определено.
Таким образом, вы бы добавить метод к отображению после создания класса:
class UU(object):
@classmethod
def get_username(cls):
pass
UU.map = {
'username': UU.get_username
}
Обратите внимание, что это означает, что, чем оттуда на UU.map['username']
использует classmethod
связанные с UU
класса. Вы не получите версию в подклассе, если вы когда-либо подклассифицировали UU
и обеспечили переопределение этого метода.
Вам нужно будет перепрыгнуть через много больше обручей, чтобы сделать эту работу для подклассов; Вы должны были бы сделать map
descriptor object, так что вы можете связать методы класса при поиске значений в отображении, а не при определении отображения:
class BindingMap(dict):
def __get__(self, instance, cls=None):
return {k: v.__get__(instance, cls) if hasattr(v, '__get__') else v for k, v in self.items()}
class UU(object):
@classmethod
def get_username(cls):
pass
map = BindingMap({
'username': get_username,
})
карта будет производить методы переплетенного класса по требованию, распространяющимся на подклассы :
>>> class BindingMap(dict):
... def __get__(self, instance, cls=None):
... return {k: v.__get__(instance, cls) if hasattr(v, '__get__') else v for k, v in self.items()}
...
>>> class UU(object):
... @classmethod
... def get_username(cls):
... pass
... map = BindingMap({
... 'username': get_username,
... })
...
>>> UU.map
{'username': <bound method type.get_username of <class '__main__.UU'>>}
>>> UU.map['username']
<bound method type.get_username of <class '__main__.UU'>>
>>> UU.map['username']()
>>> class UU(object):
... @classmethod
... def get_username(cls):
... print('Username for class {}'.format(cls.__name__))
... map = BindingMap({
... 'username': get_username,
... })
...
>>> UU.map
{'username': <bound method type.get_username of <class '__main__.UU'>>}
>>> UU.map['username']
<bound method type.get_username of <class '__main__.UU'>>
>>> UU.map['username']()
Username for class UU
>>> class Foo(UU):
... pass
...
>>> Foo.map
{'username': <bound method type.get_username of <class '__main__.Foo'>>}
>>> Foo.map['username']
<bound method type.get_username of <class '__main__.Foo'>>
>>> Foo.map['username']()
Username for class Foo
Зачем вы хотите это сделать? – rlms
'UU.get_username'" работает ", он просто ничего не делает. Что означает «карта»? Это просто позволяет вам написать что-то многословное, как 'UU.map ['username'] 'как ссылка на метод класса. (Или это было бы, если бы 'get_username' были определены еще, а это не так.) – chepner
В другой функции я хочу передать определенные ключи на карту и запустить функции, соответствующие значениям. Однако эти функции могут быть неактивными. Карта может быть выведена из класса, но в значительной степени она доступна для удобочитаемости. –