回答
class
的對象B
是type
UpperMeta
。
這導致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']
屬性訪問的默認行爲是從o中獲取,設置或刪除 屬性bject的字典。例如,a.x有一個以a開頭的 查找鏈。 字典 ['x'],然後 類型(a)。 字典 ['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分鐘左右。
爲什麼B類有回聲的方法,B不是UpperMeta的子類,它 不應該有回聲屬性?
如果你看看What is a metaclass in Python?或Customizing class creation,你看,(從Python文檔引號)
如果
__metaclass__
定義,然後分配給它的調用會 調用,而不是類型()。
本質是類聲明的動態形式。名稱字符串 是類名稱,並且成爲
__name__
屬性;基元 元組逐項列出基類併成爲__bases__
屬性; 和字典字典是包含 類體的定義的命名空間,並且成爲__dict__
屬性。例如, 下列兩個語句創建相同類型的對象:>>> class X(object): ... a = 1 ... >>> X = type('X', (object,), dict(a=1))
是這樣的,它是「一樣,」類擴展。這也是答案
什麼屬性類從元類獲得?
幾乎所有的東西。
如果你想知道你是否需要他們,你不這樣做(誰 確實需要他們肯定知道,他們需要的,不 需要有關解釋的人爲什麼)。
但在video posted by @Sebastian,他說
問:你能不能有太多 A的[元編程]:無
所以他認爲這足夠重要的學習。
- 1. Javascript - 具有其他類元素屬性的類元素
- 2. 爲什麼元類有一個類型?
- 3. 選擇具有一個屬性或其他屬性的元素
- 4. 爲什麼SerialPort類沒有RIHolding屬性?
- 5. 什麼是屬性/字段的含義具有相同類型作爲其
- 6. 爲什麼LDAP inetOrgPerson類具有preferredLanguage屬性,但沒有時區屬性?
- 7. 爲什麼一起刪除具有contenteditable = false屬性的元素
- 8. 爲什麼System.Data.Services.MimeTypeAttribute現在只有一個類級屬性?
- 9. 從可變其他類具有一個ngFor的元件上屬性
- 10. 獲取具有另一個屬性的類的屬性
- 11. 爲什麼ClipBoard類具有名稱屬性
- 12. 爲什麼WEKA-TestSets必須具有類屬性?
- 13. 應用類到元素具有屬性
- 14. 定義Matlab的類具有另一個類的屬性
- 15. 選擇具有類屬性的一系列元素中的第一個元素
- 16. 類型轉換爲具有相同屬性的另一個
- 17. 爲什麼一個元素具有相同的屬性兩次不同的值?
- 18. 查找具有單個屬性的類
- 19. 爲什麼jQuery爲類屬性添加一個空格?
- 20. 爲什麼有一個staff_typ_id屬性?
- 21. 具有類繼承性的Python元類
- 22. 類具有空屬性
- 23. 爲什麼基類私有屬性被派生類訪問?
- 24. 什麼是「這個」類的「s」屬性?
- 25. 創建具有不同屬性一類
- 26. 爲什麼UITableViewCell具有contentView屬性?
- 27. 爲什麼rownames(installed.packages())具有names屬性?
- 28. 類添加到具有其名稱屬性文字的每個元素
- 29. 爲什麼我無法從另一個類訪問我的UIView的類屬性?
- 30. 查找具有給定類和多個屬性的元素Jquery
我找不到報價!謝謝。 –
@塞巴斯蒂安:不客氣。這是在開始之後。感謝您的視頻。 –