我正在设计一个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
虽然我已经描述了我的具体案例,但我真诚地欢迎关于特殊方法的实施/使用是不良做法的一般性讨论。
提前感谢您抽出时间回答我的问题!
答案 0 :(得分:2)
这不一定是坏习惯。获取和设置项目的事情是你只为他们获得一个操作。也就是说,只有一种语法允许您使用方括号执行object[index]
。所以主要的是确保你真的想要用你正在定义的操作“消耗”这种语法。
如果在SimAPI中,这些getValue
方法确实看起来像是一个明显的选择 - 也就是说,如果getValue
确实获得 值,而不仅仅是 a 价值 - 看起来很好。您要避免的是选择相对随机或非特殊的操作,并通过__getitem__
访问它来赋予其特殊状态。