我想使用括号表达式来访问dict
中的值,但没有任何其他dict
功能。
在下面的示例中,我使用表达式variable[something]
以与variable
相同的方式查询dict
。后面没有dict
的其他功能,计算返回的内容(something
为'color'
时为颜色,其他内容为"hello"
。< / p>
import random
class ColDict(dict):
def __init__(self, *args):
dict.__init__(self, args)
self.colors = ['blue', 'white', 'red']
def __getitem__(self, item):
if item == 'color':
random.shuffle(self.colors)
return(self.colors[0])
else:
return("hello")
if __name__ == "__main__":
col = ColDict()
print(col['color'], col['color'], col['something']) # red white hello (changes on each call)
此代码按预期工作。
我想了解的是 dict功能(括号调用)的重用是否是pythonic,或者最后是否可以接受。
注意:我知道这可以通过其他方式(谎言一个函数)来完成,但我在重复使用括号调用时特意被诅咒。 重用,而不是滥用(这是我提问的核心)
答案 0 :(得分:5)
如果您不需要dict的任何功能,请提供__getitem__()
import random
class ColDict:
def __init__(self, *args):
self.colors = ['blue', 'white', 'red']
def __getitem__(self, item):
if item == 'color':
return random.choice(self.colors)
else:
return("hello")
if __name__ == "__main__":
col = ColDict()
print(col['color'], col['color'], col['something']) # red white hello (changes on each call)
答案 1 :(得分:3)
是的,它是unpythonic。没有必要从字典继承,因为你获得的只是稍长的方法名称和属性访问语法。创建一个没有显式继承的普通类来返回随机颜色。由于您的类__getitem__
为每个其他值返回一个常量,因此请创建一个具有常量的类或实例变量,该常量可以使用特定名称检索,而不仅仅是“不是color
的任何内容”。如果您担心用户无法输入随机属性名称来访问该常量,请记住“应该有一个 - 最好只有一个 - 显而易见的方法”(来自PEP-20, The Zen of Python)。< / p>
import random
class ColObj:
other = 'hello'
def __init__(self, *args):
self.colors = ['blue', 'white', 'red']
def color(self):
return random.choice(self.colors)
if __name__ == "__main__":
col = ColObj()
print(col.color, col.color, col.other)
如果这是所有类的,我根本不需要一个类 - 你可以简单地定义一个函数color
和一个字符串(或其他常量)other
。< / p>
import random
other = 'hello'
def color(colors=('blue', 'white', 'red')):
return random.choice(colors)
if __name__ == "__main__":
print(color(), color(), other)