[英]How to create methods dynamically in Python ( name + code )
我正在嘗試在構造函數中的python中動態添加新方法...
我用C ++編寫了一個Python模塊,該模塊與用C編寫的信號處理庫進行交互……我有通用的方法來訪問我的模塊(稱為filter )參數。
例如。:
int my_filter_set( void * filter_handle, const char * method_id, void * p_arg );
所以我的cpython像這樣包裝它:
filter.set(method_id,value)
而且我可以訪問我的所有方法id 。
>>> filter.setters
['SampleRate','...']
我想產生像這樣的setter:
>>> filter.setSampleRate(value)
在派生類中。
class Filter(BaseFilter):
'''
classdocs
'''
def __init__(self, name, library):
'''
Constructor
'''
BaseFilter.__init__(self,name,library)
for setter_id in self.setters:
code = 'self.set(' + setter_id + ',value)'
# @todo add the method body to a new method called 'set' + method_id (with 'value' as argument)
我已經檢查過了,但是我看不到如何使它適應我的目的。
謝謝。
您可以檢查與setters
匹配的方法名稱,而不是動態創建方法,然后動態分派到set()
方法。 這可以通過重寫Filter
類中的__getattribute__()
來實現:
class BaseFilter(object):
setters = ('SampleRate', 'Gain', 'BitDepth',)
def set(self, method_id, value):
print 'BaseFilter.set(): setting {} to {}'.format(method_id, value)
class Filter(BaseFilter):
def __getattribute__(self, name):
method_id = name.lstrip('set')
if name.startswith('set') and method_id in super(Filter, self).setters:
def _set(value):
return self.set(method_id, value)
return _set
else:
return super(Filter, self).__getattribute__(name)
在這里,對於要分派給BaseFilter.set()
, __getattribute__()
BaseFilter.set()
__getattribute__()
返回BaseFilter.set()
的包裝版本,該包裝版本可以在閉包中訪問method_id
。
>>> f = Filter()
>>> f.setSampleRate(44000)
BaseFilter.set(): setting SampleRate to 44000
>>> f.setBitDepth(16)
BaseFilter.set(): setting BitDepth to 16
>>> f.setGain(100)
BaseFilter.set(): setting Gain to 100
>>> f.setHouseOnFire(999)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in __getattribute__
AttributeError: 'Filter' object has no attribute 'setHouseOnFire'
我不確定您的setter方法名稱在第一次遇到類定義之前是否可用,如果這樣,使用元類創建類可能是合適的。 如果它們僅在運行時可用,那么此答案將為您提供解決方案的途徑: 向現有對象實例添加方法
根據您的描述,我無法告訴您是在尋找一種在運行時創建Python函數的方法,還是在尋找一種為現有代碼庫提供Python綁定的方法。 有很多方法可以使您的代碼可供Python程序員使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.