Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Dictionary - Fatal编程技术网

Python 为什么';类中字典中的属性值是否引用该类的同一属性?

Python 为什么';类中字典中的属性值是否引用该类的同一属性?,python,oop,dictionary,Python,Oop,Dictionary,我实例化该类的一个对象,并为其分配一个新值: class test(object): def __init__(self): self.a = 5 self.d = {'alfa': self.a} 为什么a_test.d['alfa']保持为5而不更改为7?因为self.a在字典中赋值时包含值5。整数是不可变的,因此不进行引用。请阅读Python的相关内容。因为self.a在字典中赋值时包含值5。整数是不可变的,因此不进行引用。请阅读Python

我实例化该类的一个对象,并为其分配一个新值:

class test(object): 
    def __init__(self): 
        self.a = 5 
        self.d = {'alfa': self.a}

为什么
a_test.d['alfa']
保持为5而不更改为7?

因为
self.a
在字典中赋值时包含值
5
。整数是不可变的,因此不进行引用。请阅读Python的相关内容。

因为
self.a
在字典中赋值时包含值
5
。整数是不可变的,因此不进行引用。请阅读Python的相关内容。

调用构造函数时创建字典。因此,字典中的值是在构造过程中设置的——它们不是通过引用传递的,而是通过值传递的


字典中的值指向传入的对象的值,而不是对象本身。因此,仅将
self.a
作为值不会自动更新字典,除非
self.a
是可变的(例如列表)。

调用构造函数时创建字典。因此,字典中的值是在构造过程中设置的——它们不是通过引用传递的,而是通过值传递的


字典中的值指向传入的对象的值,而不是对象本身。因此,仅将
self.a
作为值不会自动更新字典,除非
self.a
是可变的(例如列表)。

您应该添加一个setter来管理类实例:

a_test = test()
a_test.a = 7

您应该添加一个setter来管理类实例:

a_test = test()
a_test.a = 7

让我提出我的
DictObj
类,我一直在使用它来解决以下问题:

def set_a(self, new_val):
   self.a = new_val
   self.d = {'alfa': self.a}
条目存储在字典中,但也可以作为对象的属性进行访问


您可以使用更神奇的方法轻松地扩展它,以满足您的需要。

让我提出我的
DictObj
类,我一直在使用它来解决以下问题:

def set_a(self, new_val):
   self.a = new_val
   self.d = {'alfa': self.a}
class DictObj(dict):
    """
    a dictionary like class that allows attribute-like access to its keys

    d = DictObj(a=2, b=7)
    d['a']  --> 2
    d.a     --> 2

    """
    def __getattr__(self, name):
        return self.__getitem__(name)


    def __setattr__(self, name, value):
        if name in self:
            self.__setitem__(name, value)
        else:
            super(DictObj, self).__setattr__(name, value)


    def __add__(self, other):
        res = DictObj(self)
        res.update(other)
        return res
条目存储在字典中,但也可以作为对象的属性进行访问

您可以使用更神奇的方法轻松扩展此功能,以满足您的需要

class DictObj(dict):
    """
    a dictionary like class that allows attribute-like access to its keys

    d = DictObj(a=2, b=7)
    d['a']  --> 2
    d.a     --> 2

    """
    def __getattr__(self, name):
        return self.__getitem__(name)


    def __setattr__(self, name, value):
        if name in self:
            self.__setitem__(name, value)
        else:
            super(DictObj, self).__setattr__(name, value)


    def __add__(self, other):
        res = DictObj(self)
        res.update(other)
        return res
您可以在这里看到,在赋值实例中,将“a”的值传递给字典“b”,它是5

所以b['key']的值为5,而不是a的引用。 所以不管你们是在改变a的参考值

您可以在这里看到,在赋值实例中,将“a”的值传递给字典“b”,它是5

所以b['key']的值为5,而不是a的引用。
所以,无论您是在改变a的参考值。

但请不要这样做。Python中不鼓励Setter方法。相反,使用绑定了getter和setter的属性。但请不要这样。Python中不鼓励Setter方法。相反,使用绑定了getter和setter的属性。标签随机出现,所以我想我可以用字典来代替40个如果。。但是我讨厌通过说a_test.d['alfa']而不是a_test.aMaybe来访问属性。你可以展示一些更具体的代码来展示你是如何构建你的对象的,我们可以建议一些解决方案。(我可以在同一个问题中这样做吗?)是的,只需点击你的帖子下面并将其添加进来!我知道怎么做,问题是,它会完全改变最初的问题,我不确定这是否可行。另外,我对OOP一无所知,所以在我继续发布一些琐碎的东西之前,也许我应该做一些基本的阅读。问题是我有40个这样的属性,它们是通过解析html文件来填充的。标签随机出现,所以我想我可以用字典来代替40个如果。。但是我讨厌通过说a_test.d['alfa']而不是a_test.aMaybe来访问属性。你可以展示一些更具体的代码来展示你是如何构建你的对象的,我们可以建议一些解决方案。(我可以在同一个问题中这样做吗?)是的,只需点击你的帖子下面并将其添加进来!我知道怎么做,问题是,它会完全改变最初的问题,我不确定这是否可行。另外,我对OOP一无所知,所以在我继续发表一些琐碎的文章之前,也许我应该先读一些基础知识。