访问python中的对象时返回默认成员
我正在编写一个“环境”,其中每个变量由一个值和一个描述组成:访问python中的对象时返回默认成员,python,dynamic-data,Python,Dynamic Data,我正在编写一个“环境”,其中每个变量由一个值和一个描述组成: class my_var: def __init__(self, value, description): self.value = value self.description = description 创建变量并将其放入字典中: my_dict["foo"] = my_var(0.5, "A foo var") 这很酷,但是99%的变量操作都使用“value”成员。所以我必须这样写: print
class my_var:
def __init__(self, value, description):
self.value = value
self.description = description
创建变量并将其放入字典中:
my_dict["foo"] = my_var(0.5, "A foo var")
这很酷,但是99%的变量操作都使用“value”成员。所以我必须这样写:
print my_dict["foo"].value + 15 # Prints 15.5
my_dict_value["foo"] = 0.5
my_dict_description["foo"] = "A foo var"
或
我希望对象my_dict[“foo”]上的所有操作都可以默认为“value”成员。换句话说,我想写:
print my_dict["foo"] + 15 # Prints 5.5
诸如此类
我找到的唯一方法是重新实现所有下划线成员(eq、add、str等),但我觉得这是错误的方法。有什么神奇的方法我可以用吗
一个解决办法是使用更多的词典,如下所示:
print my_dict["foo"].value + 15 # Prints 15.5
my_dict_value["foo"] = 0.5
my_dict_description["foo"] = "A foo var"
但我不喜欢这个解决方案。你有什么建议吗?我认为,你必须做这么多的工作才能走上一条奇特的捷径,这表明你在违反规则。你所做的违反了LSP;这是违反直觉的
my_dict[k] = v;
print my_dict[k] == v # should be True
即使是两个单独的dict也比改变dict的含义要好。我认为,你必须做这么多的工作才能做出一条奇特的捷径,这表明你在违反规则。你所做的违反了LSP;这是违反直觉的
my_dict[k] = v;
print my_dict[k] == v # should be True
即使是两个单独的dict也比更改dict的含义要好。两个一般注释
x= My_Var(0.5, "A foo var")
python如何区分x
、复合对象和x的值(x.value
)
您想要以下行为吗
- 有时
表示整个复合对象x
- 有时
表示x
x.value
x= My_Var(0.5, "A foo var")
python如何区分x
、复合对象和x的值(x.value
)
您想要以下行为吗
- 有时
表示整个复合对象x
- 有时
表示x
x.value
你如何区分这两者?您将如何告诉Python您的意思?通过实现的“模拟数值类型”部分中的运算符,您可以创建一个对象,该对象的行为主要类似于“值”,但有一个附加属性“说明” 产生:
b= 20
d= 3
f.description= my f'd up fooness
通过实现的“模拟数值类型”一节中的运算符,可以创建一个对象,该对象的行为主要类似于“值”,但有一个附加属性“描述” 产生:
b= 20
d= 3
f.description= my f'd up fooness
我个人只会使用两个字典,一个用于值,一个用于描述。你对魔法行为的渴望不是很像蟒蛇 话虽如此,您可以实现自己的dict类:
class DescDict(dict):
def __init__(self, *args, **kwargs):
self.descs = {}
dict.__init__(self)
def __getitem__(self, name):
return dict.__getitem__(self, name)
def __setitem__(self, name, tup):
value, description = tup
self.descs[name] = description
dict.__setitem__(self, name, value)
def get_desc(self, name):
return self.descs[name]
您将按如下方式使用该类:
my_dict = DescDict()
my_dict["foo"] = (0.5, "A foo var") # just use a tuple if you only have 2 vals
print my_dict["foo"] + 15 # prints 15.5
print my_dict.get_desc("foo") # prints 'A foo var'
如果你决定走魔术行为路线,那么这应该是一个很好的起点。我个人只会使用两个字典,一个用于值,一个用于描述。你对魔法行为的渴望不是很像蟒蛇 话虽如此,您可以实现自己的dict类:
class DescDict(dict):
def __init__(self, *args, **kwargs):
self.descs = {}
dict.__init__(self)
def __getitem__(self, name):
return dict.__getitem__(self, name)
def __setitem__(self, name, tup):
value, description = tup
self.descs[name] = description
dict.__setitem__(self, name, value)
def get_desc(self, name):
return self.descs[name]
您将按如下方式使用该类:
my_dict = DescDict()
my_dict["foo"] = (0.5, "A foo var") # just use a tuple if you only have 2 vals
print my_dict["foo"] + 15 # prints 15.5
print my_dict.get_desc("foo") # prints 'A foo var'
如果你决定走魔法行为路线,那么这应该是一个很好的起点