Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问python中的对象时返回默认成员_Python_Dynamic Data - Fatal编程技术网

访问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的含义要好。

两个一般注释

  • 请使用大写字母作为类名

  • 请(除非使用Python 3.0)子类对象<代码>类My_Var(对象):,例如

  • 现在谈谈你的问题

    假设你喜欢

    x= My_Var(0.5, "A foo var")
    
    python如何区分
    x
    、复合对象和x的值(
    x.value

    您想要以下行为吗

    • 有时
      x
      表示整个复合对象

    • 有时
      x
      表示
      x.value

    你如何区分这两者?您将如何告诉Python您的意思?

    两个一般注释

  • 请使用大写字母作为类名

  • 请(除非使用Python 3.0)子类对象<代码>类My_Var(对象):,例如

  • 现在谈谈你的问题

    假设你喜欢

    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'
    
    如果你决定走魔法行为路线,那么这应该是一个很好的起点