Python - 元類編程(type)

一、類是如何產生的
  • 表面上使用繼承創建一個類
  • 所有類都直接或間接繼承於object
    而真正創建類的是type
  • type
    type通常的用法–判斷對象的類型
    但除此之外,它最大的用途是來動態的創建類,當Python掃描到class語法的時候,就會調用type函數進行類的創建
  • type 創建類
    • type()需要接受三個參數
    • 1.類的名稱:若不指定也要傳入空字符串
    • 2.父類:注意以tuple的形式傳入,沒有也要傳入控tuple:(),默認的是object
    • 3.綁定的方法或屬性:注意以dict的形式傳入
# 定義一個父類
class Parent:
    def foo(self):
        print('Parent')
        
# 準備一個方法
def say(self):
    print('hello')
    
# 使用type來創建一個類
Person = type('Person',(Parent,),{'name':'person','say':say})

p = Person()

p.foo()
p.say()
# 結果
Parent
hello
元類
  • 類 -用來創建對象的模板
  • 那麼,元類就是創建類的模板
  • type就是一個元類

就連 object 也是由type創建的
哈哈,就連type自己也是type創建的

In [1]: type(type)
Out[1]: type

In [2]: type(object)
Out[2]: type

In [3]: type(int)
Out[3]: type

In [4]: type(str)
Out[4]: type

In [5]: type(bool)
Out[5]: type

In [6]: type(list)                                                       
Out[6]: type

  • 有點神奇樣
    • str:用來創建字符串對象的類
    • int:用來創建整數對象的類
    • type:用來創建類對象的類
    • 等等…

示例

# 繼承type
class Base(type):
    def __new__(cls,*args,**kwargs):
        print('in Base')
        return super().__new__(cls,*args,**kwargs)
    
class Person(metaclass=Base):
    def __init__(self,name):
        self.name = name

p = Person('tom')

# 控制檯
in Base
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章