【问题标题】:How modify a class attribute through a reference of it?如何通过引用来修改类属性?
【发布时间】:2018-03-26 15:23:57
【问题描述】:

例如下面的例子:

class myClass():
    def __init__(self):
        self.A = 1.

class essai():
    def __init__(self):
        self.C = myClass()

    def ref(self):

        mystring = 'C.A'
        nameclass, nameparam = mystring.split('.')
        print(nameclass, nameparam)
        print(getattr(getattr(self,nameclass),nameparam))
        Ref = getattr(getattr(self,nameclass),nameparam)
        print(Ref)
        self.modify_val(Ref,2)
        print(self.C.A)

    def modify_val(self,x,y):
        x=y


E=essai()
E.ref()

我想做的是获取essaiC 类的属性A 的引用。关键是我想使用该引用来更新方法modify_val 中的C.A 的值。通过使用包含我要修改的类和属性 (mystring = 'C.A') 的字符串,我不明白如何获取对该属性的引用(例如 C.A)以及如何使用该引用进行修改属性。在我的示例中,modify_val 函数不会更新 C.A 值,因为 Ref 实际上不是参考。 因此我得到:

C A
1.0
1.0
1.0

我希望最后一次打印是 2

【问题讨论】:

    标签: python class reference attributes


    【解决方案1】:

    我建议使用setattr(object, name, value)

    来自setattr的python文档

    setattr(对象、名称、值)

    这是 getattr() 的对应物。参数是一个对象,一个 字符串和任意值。该字符串可以命名一个现有的 属性或新属性。该函数将值分配给 属性,前提是对象允许。例如,setattr(x, 'foobar', 123) 等价于 x.foobar = 123。

    通过将nameclassnameparam 直接传递给modify_val,您应该能够执行以下操作:

    def modify_val(self, nameclass, nameparam, value)
        setattr(getattr(self,nameclass),nameparam, value)
    

    希望对您有所帮助。

    【讨论】:

    • 我无法使用 setattr。我想在 numba njit 函数中更新类的属性。为此,我需要像对方法一样传递对属性的引用。就像如果我有一个 ref=essai.modify_val 会给我一个可以传递给 njit 函数的参考。但我不能用属性来做到这一点。
    • 好的。我不特别了解 numba,但我找到了一个关于 python here 中参数引用的答案。它建议始终将参数视为引用,但有些是可变的,有些是不可变的。
    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 2021-03-17
    • 2017-08-03
    • 2012-12-02
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多