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)#傳回一個類