【发布时间】:2018-09-05 23:56:54
【问题描述】:
我是 Python 新手,我想知道为什么我不能使用函数更改类实例的属性,如果我将实例作为函数参数传递 例如,如果我有:
class sol:
def __init__(self):
self.val = 0
def fun1(obj, attrib):
obj[attrib] = 1
newSol = sol()
fun1(newSol, "val")
为什么 fun1 不能更改对象属性?有没有办法改变它,或者“val”属性是不可变的?
【问题讨论】:
-
属性访问 (
obj.attr) 和索引 (obj[index]) 在 Python 中是完全不同的概念。您需要使用setattr(obj, attrib, 1)间接设置属性。 -
对不起,在我看来,我将 dicts 视为对象,并且我假设设置 dict 属性的语法与设置对象属性的语法相同。语法 dict[attrib] = 1 是否仅适用于字典?
-
您可以通过实现
__setitem__()/__getitem__()方法创建自己的支持索引的类。 -
@albert
dicts 是对象。 Python 中的一切都是对象。 dict 对象不能有属性,使用mydict[k] = v不会在 dict 对象上创建属性。 -
@juanpa.arrivillaga 我的意思是我将 Python 中的所有对象都视为 dicts。我对你所说的听写有点困惑。使用 mydict[k] = v 确实为 mydict 创建了一个 k 属性,不是吗?
标签: python python-3.x pass-by-reference