1. 程式人生 > >python動態建立類

python動態建立類

場景

python是一門動態語言,開發者可以再執行時,建立新的型別。其場景:
依據遠端伺服器功能而建立一個新類,呼叫伺服器支援什麼類和方法。舉個列子:
('/cat/meow',
 '/cat/eat',
 '/cat/sleep',
 '/dog/bark',
 '/dog/eat',
 '/dog/sleep')

建立具有特定方法的動態類來呼叫伺服器相應的遠端方法。

type()

這個需求,就意味著不能用 已知道的語法。
class A(object):
    ...

class B(A):
    ...

我們可以用exec,繞道解決這個問題。

exec('class %s(object): pass' % 'Cat')

但是,這不是正確的方式。生成的程式碼,容易損壞、錯誤。 

用 type() 是個更好的方法,簡單、執行快:不需要解析字串。

    1 # -*- coding: utf-8 -*-
  2 #!/usr/bin/python
  3 
  4 
  5 def remote_call(arg1):
  6     print arg1
  7 
  8 new_class = type('Cat', (object,), {'meow': remote_call('meow'), 'eat': remote_call('eat'), 'sleep': remote_call('sleep')})
  9 
 10 #Another example
 11
#item = type('TYPE_KEYLIST_V1', (object,), { "name": "", "cname": "key_command", "type": "T_KEYLIST_V1" }) 12 13 type(object) 14 type(new_class) 15 print new_class.__name__ 16 print new_class.__bases__ 17 18 ###AttributeError: type object 'Cat' has no attribute 'value' 19 #print new_class.value
20 21 #Add the property of instance only 22 new_class.value = 11 23 print new_class.value ~ ~

Result

這裡寫圖片描述

在開發中,不得不參照外部,如:資料庫schema或者網頁服務,而建立一個類時,這個方式非常有用。

Reference :

http://henry.precheur.org/python/Dynamically%20create%20a%20type%20with%20Python.html