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中的元類Python
- Python元類與列舉類Python
- Python如何自定義元類Python
- 由ORM談Python元類ORMPython
- Python 的元類設計起源自哪裡?Python
- 2.1.5 Python元類深刻理解(metaclass)Python
- Python學習之路41-元類Python
- Python進階丨如何建立你的第一個Python元類?Python
- python面試題~反射,元類,單例Python面試題反射單例
- python類的子類Python
- python 類的子類Python
- 元類
- Python 元類機制的工作流程及引數呼叫的不同Python
- python的類Python
- python的元組Python
- 元類:Metaclass
- 【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
- 【python】類的特殊成員Python
- python 介面實現類的Python
- Python列印類的屬性Python
- Python_11 類的方法Python