2015-11-02 68 views

回答

1

class的對象BtypeUpperMeta

這導致UpperMeta的所有類方法在類B上可用。該屬性不上一流B,但會從B的類代理(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

屬性訪問的默認行爲是從o中獲取,設置或刪除 屬性bject的字典。例如,a.x有一個以a開頭的 查找鏈。 字典 ['x'],然後 類型(a)。 字典 ['x'],並繼續通過類型(a) 的基類不包括元類。


這是朝着結束有點混亂「......不包括元類..」,這實際上意味着式(一)元類,所以說,如果你的元類UpperMeta有一個元類TopMetaTopMeta定義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分鐘左右。

1

爲什麼B類有回聲的方法,B不是UpperMeta的子類,它 不應該有回聲屬性?

如果你看看What is a metaclass in Python?Customizing class creation,你看,(從Python文檔引號)

如果__metaclass__定義,然後分配給它的調用會 調用,而不是類型()。

type()

本質是類聲明的動態形式。名稱字符串 是類名稱,並且成爲__name__屬性;基元 元組逐項列出基類併成爲__bases__屬性; 和字典字典是包含 類體的定義的命名空間,並且成爲__dict__屬性。例如, 下列兩個語句創建相同類型的對象:

>>> class X(object): 
...  a = 1 
... 
>>> X = type('X', (object,), dict(a=1)) 

是這樣的,它是「一樣,」類擴展。這也是答案

什麼屬性類從元類獲得?

幾乎所有的東西。

也請be aware that

如果你想知道你是否需要他們,你不這樣做(誰 確實需要他們肯定知道,他們需要的,不 需要有關解釋的人爲什麼)。

但在video posted by @Sebastian,他說

問:你能不能有太多 A的[元編程]:無

所以他認爲這足夠重要的學習。

+0

我找不到報價!謝謝。 –

+0

@塞巴斯蒂安:不客氣。這是在開始之後。感謝您的視頻。 –

相關問題