Python的元類
什麼是元類(metaclass)?
元類是類的類,是類的模板
元類的例項為類,正如類的例項為物件
class Foo:
pass
t1=Foo #t1是通過Foo類例項化的物件
print(type(f1))
print(type(Foo))
所有的物件都是例項化或者說呼叫類而得到的(呼叫類的過程稱為類的例項化),比如物件t1是呼叫FOO類得到的一個例項。
如果一切皆為物件,那麼類Foo本質也是一個物件,既然所有的物件都是呼叫類得到的,那麼Foo必然也是呼叫了一個類得到的,這個類稱為元類。
一般來說,元類均被命名字尾為Metalass。想象一下,我們需要一個可以自動打招呼的元類,它裡面的類方法呢,有時需要say_Hello,有時需要say_Hi,有時又需要say_Sayolala,有時需要say_Nihao。
如果每個內建的say_xxx都需要在類裡面宣告一次,那將是多麼可怕的苦役! 不如使用元類來解決問題。
以下是建立一個專門“打招呼”用的元類程式碼:
class SayMetaClass(type):
def __new__(cls, name, bases, attrs):
attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')
return type.__new__(cls, name, bases, attrs)
class SayMetaClass(type):
def __new__(cls, name, bases, attrs):
attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')
return type.__new__(cls, name, bases, attrs)
記住兩點:
1、元類是由“type”衍生而出,所以父類需要傳入type。【道生一,所以一必須包含道】
2、元類的操作都在 __new__中完成,它的第一個引數是將建立的類,之後的引數即是三大永恆命題:我是誰,我從哪裡來,我將到哪裡去。 它返回的物件也是三大永恆命題,接下來,這三個引數將一直陪伴我們。
相關文章
- Python 元類Python
- python中的元類MetaclassPython
- 理解Python中的元類Python
- Python元類與列舉類Python
- [心得]python元類解密Python解密
- Python元類再談Python
- python元類淺析Python
- 由ORM談Python元類ORMPython
- Python之元類筆記Python筆記
- 草根學Python(十二)元類Python
- 深刻理解Python中的元類(metaclass)Python
- python 類和元類(metaclass)的理解和簡單運用Python
- Python 的元類設計起源自哪裡?Python
- Python學習之路41-元類Python
- 2.1.5 Python元類深刻理解(metaclass)Python
- python面試題~反射,元類,單例Python面試題反射單例
- Python進階丨如何建立你的第一個Python元類?Python
- Django中的元類Django
- [python]python三元表示式另類實現方式Python
- 元類:Metaclass
- python 類的子類Python
- python類的子類Python
- python的元組Python
- 元類詳解
- 23. 元類
- 友元函式和友元類函式
- python的類Python
- python類的使用Python
- Python的類方法Python
- 一篇文章告訴你什麼是 Python 元類Python
- 【Python】python類的繼承Python繼承
- Python 中的元類到底是什麼?這篇恐怕是最清楚的了Python
- Python的元組()與字典{}Python
- python元組的特點Python
- Python的元組()與字典 { }Python
- python列表元組的操作Python
- Python的元組和列表Python
- Python之難點元類|一句話給你安排的明明白白Python