python動態建立類
阿新 • • 發佈:2019-01-03
場景
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