class
объект B
имеет type
UpperMeta
.
Это приводит к тому, что все классные методы UpperMeta
доступны для класса B
. Атрибут не на классе B
, но получает проксированном из класса B
«S (B
класс, не экземпляр B
)
>>> print dir(B)
# General lack of echo()
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
Это здесь:
>>> print dir(B.__class__)
['__abstractmethods__', '__base__', ..., 'echo', 'mro']
От documentation:
Поведение по умолчанию для доступа к атрибутам - это получение, установка или удаление атрибута f rom словарь объекта. Например, a.x имеет цепочку поиска , начиная с. dict ['x'], затем тип (a). dict ['x'] и продолжения базовых классов типа (a), исключая метаклассы.
Это немного сбивает с толку в конце «... исключая метаклассами ..», что на самом деле означает метаклассами типа (а), поэтому говорят, что если ваш метаклассом UpperMeta
имеет метакласса TopMeta
и TopMeta
определяет sos()
, что один не будет искаться:
class TopMeta(type):
def __new__(cls, clsname, bases, dct):
uppercase_attr = {}
for name, val in dct.items():
if not name.startswith('__'):
uppercase_attr[name.upper()] = val
else:
uppercase_attr[name] = val
return super(TopMeta, cls).__new__(cls, clsname, bases, uppercase_attr)
def sos(cls):
return 'sos'
class UpperMeta(type):
__metaclass__ = TopMeta
def __new__(cls, clsname, bases, dct):
uppercase_attr = {}
for name, val in dct.items():
if not name.startswith('__'):
uppercase_attr[name.upper()] = val
else:
uppercase_attr[name] = val
return super(UpperMeta, cls).__new__(cls, clsname, bases, uppercase_attr)
class B(object):
__metaclass__ = UpperMeta
assert not hasattr(B, 'sos')
только говорить, что когда-нибудь объяснил метаклассами правильно: David Beazley - Python 3 Metaprogramming. У вас есть только первые 80 минут или около того.
Я не мог найти цитату! Благодарю. –
@ Себастьян: Добро пожаловать. Это сразу после начала. Спасибо тебе за видео. –