天天看點

元類元類會自動将你通常傳給‘type’的參數作為自己的參數傳入将它們轉為大寫形式

def choose_class(name):

if name == 'foo':

class Foo(object):

pass

return Foo # 傳回的是類,不是類的執行個體

else:

class Bar(object):

return Bar

MyClass = choose_class('foo')

print MyClass # 函數傳回的是類,不是類的執行個體

#輸出:<class 'main.Foo'>

print MyClass() # 你可以通過這個類建立類執行個體,也就是對象

#輸出:<main.Foo object at 0x1085ed950

MyClass = MetaClass() #元類建立

MyObject = MyClass() #類建立執行個體

實際上MyClass就是通過type()來創建立出MyClass類,它是type()類的一個執行個體;同時MyClass本身也是類,也可以建立出自己的執行個體,這裡就是MyObject

age = 35

age.class

#輸出:<type 'int'>

name = 'bob'

name.class

#輸出:<type 'str'>

def foo(): pass

foo.class

#輸出:<type 'function'>

class Bar(object): pass

b = Bar()

b.class

#輸出:<class 'main.Bar'>

對于任何一個class的class屬性又是什麼呢?

a.class.class

#輸出:<type 'type'>

age.class.class

foo.class.class

b.class.class

元類會自動将你通常傳給‘type’的參數作為自己的參數傳入

将它們轉為大寫形式

uppercase_attr = dict((name.upper(), value) for name, value in attrs)
#通過'type'來做類對象的建立
return type(future_class_name, future_class_parents, uppercase_attr)#傳回一個類