簡體   English   中英

如何在Python中動態創建方法(名稱+代碼)

[英]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)

問題是...

  • 可能嗎 ?
  • 用python類型模塊嗎?
  • 怎么做 ?

我已經檢查過了,但是我看不到如何使它適應我的目的。

謝謝。

您可以檢查與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM