【问题标题】:Python class attribute assignmentPython类属性赋值
【发布时间】: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


【解决方案1】:

Python 类实例和dict 是完全不同的野兽;您可能来自 JavaScript 背景,其中 obj.foo 等同于 obj["foo"],但这不是 Python 的工作方式。

如果您想通过str 名称设置属性,use setattr

def fun1(obj, attrib):
    setattr(obj, attrib, 1)

【讨论】:

  • 啊,好吧,我只是想知道。感谢您的澄清。
  • 考虑到大多数对象将其属性存储在__dict__ 字典中,认为对象属性和字典之间没有 关系似乎有点虚伪。
  • @PatrickHaugh:除非涉及__slots__,或者它是使用描述符实现访问的C 内置语言,或者它是tuplelist 的子类(例如,任何通过collections.namedtuple) 使用 @property 为名称等索引别名。是的,__dict__ 被实现为类似 dict 的东西,通常是实际的 dict(如果存在,但并不总是如此)。但这主要是“杂草丛生”的实现细节,与您在 99.999% 的情况下如何使用类实例无关。类实例不像dict 那样嘎嘎作响,所以这种关系在大多数情况下并不相关。
猜你喜欢
  • 2018-10-03
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多