Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Python 3.x_Pass By Reference - Fatal编程技术网

Python类属性赋值

Python类属性赋值,python,python-3.x,pass-by-reference,Python,Python 3.x,Pass By Reference,我是Python新手,我想知道如果我将实例作为函数参数传递,为什么不能使用函数更改类实例的属性 例如,如果我有: class sol: def __init__(self): self.val = 0 def fun1(obj, attrib): obj[attrib] = 1 newSol = sol() fun1(newSol, "val") 为什么fun1不能更改对象属性?有没有办法改变它,或者“val”属性是不可变的?Python类实例和dict是

我是Python新手,我想知道如果我将实例作为函数参数传递,为什么不能使用函数更改类实例的属性 例如,如果我有:

class sol:
    def __init__(self):
        self.val = 0

def fun1(obj, attrib):
    obj[attrib] = 1

newSol = sol()

fun1(newSol, "val")

为什么fun1不能更改对象属性?有没有办法改变它,或者“val”属性是不可变的?

Python类实例和
dict
是完全不同的;您可能来自JavaScript背景,
obj.foo
相当于
obj[“foo”]
,但Python不是这样工作的

如果要通过
str
name设置属性,请执行以下操作:


Python类实例和dict是完全不同的;您可能来自JavaScript背景,
obj.foo
相当于
obj[“foo”]
,但Python不是这样工作的

如果要通过
str
name设置属性,请执行以下操作:


属性访问(
obj.attr
)和索引(
obj[index]
)在Python中是完全独立的概念。您需要使用
setattr(obj,attrib,1)
间接设置属性。对不起,在我看来,我认为dict是对象,我假设设置dict属性的语法与设置object属性相同。sytax dict[attrib]=1是否只有在那时才适用于dict?您可以通过实现
\uuuuu setitem\uuuuuuuuuuuuuuuu()
/uuuuuu getitem\uuuuuuuuuu()方法来创建自己的支持索引的类。@albert
dict
是对象。Python中的一切都是对象。Dict对象不能有属性,使用
mydict[k]=v
不会在Dict对象上创建属性。@juanpa.arrivillaga我想说的是,我认为Python中的所有对象都是Dict。我对你说的dicts有点困惑。使用mydict[k]=v确实为mydict创建了一个k属性,不是吗?属性访问(
obj.attr
)和索引(
obj[index]
)在Python中是完全独立的概念。您需要使用
setattr(obj,attrib,1)
间接设置属性。对不起,在我看来,我认为dict是对象,我假设设置dict属性的语法与设置object属性相同。sytax dict[attrib]=1是否只有在那时才适用于dict?您可以通过实现
\uuuuu setitem\uuuuuuuuuuuuuuuu()
/uuuuuu getitem\uuuuuuuuuu()方法来创建自己的支持索引的类。@albert
dict
是对象。Python中的一切都是对象。Dict对象不能有属性,使用
mydict[k]=v
不会在Dict对象上创建属性。@juanpa.arrivillaga我想说的是,我认为Python中的所有对象都是Dict。我对你说的dicts有点困惑。使用mydict[k]=v确实为mydict创建了一个k属性,不是吗?啊,好吧,我只是想知道。感谢您的澄清。考虑到大多数对象将其属性存储在
\uuuuu dict\uuuu
dict中,认为对象属性和字典之间没有关系似乎有点虚伪。@PatrickHaugh:除非涉及
\uu slots\uuu
,或者它是一个内置的使用描述符实现访问的C,或者当它是
元组
列表
的子类时(例如,通过
集合制作的任何东西。namedtuple
),使用
@property
将索引别名为名称等。是的,
u dict_u
被实现为一个类似于
的东西,通常是一个实际的
dict
(当它存在时,并不总是这样)。但这主要是一个“杂草中”的实现细节,与99.999%的情况下如何使用类实例无关。类实例不像dict那样嘎嘎作响,所以这种关系在大多数情况下并不相关。感谢您的澄清。考虑到大多数对象将其属性存储在
\uuuuu dict\uuuu
dict中,认为对象属性和字典之间没有关系似乎有点虚伪。@PatrickHaugh:除非涉及
\uu slots\uuu
,或者它是一个内置的使用描述符实现访问的C,或者当它是
元组
列表
的子类时(例如,通过
集合制作的任何东西。namedtuple
),使用
@property
将索引别名为名称等。是的,
u dict_u
被实现为一个类似于
的东西,通常是一个实际的
dict
(当它存在时,并不总是这样)。但这主要是一个“杂草中”的实现细节,与99.999%的情况下如何使用类实例无关。类实例不像
dict
那样嘎嘎作响,因此这种关系在大多数情况下并不相关。
def fun1(obj, attrib):
    setattr(obj, attrib, 1)