Python作為動態語言,可以動態地創建函數和類定義。比如說定義一個Hello類,就寫一個hello.py模塊:
#! /usr/bin/env python #coding=utf-8 class Hello(object): def hello(self,name='world'): print("Hello,%s"%name)
當Python解釋器載入hello模塊時,會依次執行該模塊的所有語句,執行的結果就是動態創建了一個Hello的class對象:
from hello import Hello h = Hello() h.hello() print( type(Hello)) print (type(h))
Hello,world
<type 'type'>
<class 'hello.Hello'>
可以看到,Hello的class對象是type類型的,即Hello類是type()函數創建的。可以通過type()函數創建出Hello類,而無需class Hello(object)...這樣的定義:
def fn(self,name="world"): print("Hello,%s"%name) Hello = type('Hello',(object,),dict(hello=fn)) h = Hello() h.hello() print(type(Hello)) print(type(h))
Hello,world
<type 'type'>
<class '__main__.Hello'>
要動態創建一個class對象,type()函數依次傳入3個參數:
1、class的名稱,字符串形式;
2、繼承的父類集合,注意Python支持多重繼承,如果只有一個父類,注意tuple的單元素寫法;
3、class的方法名稱與函數綁定,這里我們把函數fn綁定到方法名hello上。