特殊方法(“魔术方法”)的哪些实现/使用在python中是不好的做法?

时间:2013-03-02 20:41:22

标签: python interface-implementation

我正在设计一个python模块,它与模拟API的几个部分接口(通过windows dll)。我想充分利用python,以便库既干净又简单易用。

当实现我自己的类与API的一部分接口时,我发现自己想要实现__getitem____setitem__作为API的getValue()setValue()的访问者方法。它为仿真软件中的内部十六进制值提供了一个更清晰的界面,但这是一种不好的做法,还是不是pythonic?

以下是我想要实施的示例:

# Note that each word is identified by a unique integer and each has a
# settable/retrievable hex value within the simulation software.

class sim:
    ...
    ...
    def __getitem__(self, key):
        ''' check for valid key range (int)'''
        ''' else throw exception '''
        val = simAPI.getValue(key) # returns the value of the word at the key in the 
                                   # software, None on failure
        if val:
            return val
        '''else throw exception '''

    def __setitem__(self, key, value):
        ''' check for valid key range and value (int, int)'''
        ''' else throw exception '''

        if not simAPI.setValue(key, value): # sets the value of the word at the key in the 
        ''' throw exception'''              # software, None on failure

    ...
    ...

这将允许:

Word = sim() 

Word[20] = 0x0003 # set word 20 to hex value 0x0003 in the simulation software

if Word[23] == 0x0005: # check if word 23 is equal to 0x0005 
    pass

并且可能有更多的开发,切片来设置多个单词:

Word[1:5] = 0x0004 # set words 1-5 to 0x0004

虽然我已经描述了我的具体案例,但我真诚地欢迎关于特殊方法的实施/使用是不良做法的一般性讨论。

提前感谢您抽出时间回答我的问题!

1 个答案:

答案 0 :(得分:2)

这不一定是坏习惯。获取和设置项目的事情是你只为他们获得一个操作。也就是说,只有一种语法允许您使用方括号执行object[index]。所以主要的是确保你真的想要用你正在定义的操作“消耗”这种语法。

如果在SimAPI中,这些getValue方法确实看起来像是一个明显的选择 - 也就是说,如果getValue确实获得 值,而不仅仅是 a 价值 - 看起来很好。您要避免的是选择相对随机或非特殊的操作,并通过__getitem__访问它来赋予其特殊状态。