gpt4 book ai didi

python - 我需要定义 __setattr__ 来分配没有属性的字段,但对定义了属性的字段使用 setter/getter 函数

转载 作者:太空狗 更新时间:2023-10-30 00:41:56 26 4
gpt4 key购买 nike

定义 __setattr__ 会覆盖我在类中定义的所有 setter 方法/属性。如果字段存在属性,我想在属性中使用定义的 setter 方法,否则使用 self.__dict__[name] = value

帮助!我找到了一个使用 __setitem__ 的解决方案,但这对我不起作用

python 类中的属性存储在哪里?我如何访问它们?

我如何定义 __setattr__ 以便它使用定义了 setter 方法的字段的属性?

class test(object):

def _get_gx(self):
print "get!"
return self.__dict__['gx']

def _set_gx(self, gx):
print "set!"
self.__dict__['gx'] = gx
gx = property(_get_gx, _set_gx)

def __setattr__(self, name, value):
self.__dict__[name] = value

def __init__(self):
pass

还有,

为什么是“得到!”当我这样做时打印两次,

x = test()
x.gx = 4
x.gx

prints:

"gets!"
"gets!"
4

最佳答案

您需要重写您的__setattr__ 函数。根据 docs ,新样式类应该使用 baseclass.__setattr__(self, attr, value) 而不是 self.__dict__[attr] = value。前者将查找任何描述符,而后者将直接分配给字典。

所以将你的方法重写为

def __setattr__(self, name, value):
object.__setattr__(self, name, value)

def __setattr__(self, name, value):
super(Test, self).__setattr__(name, value)

你会没事的。代码

class Test(object):
@property
def gx(self):
print "getting gx"
return self.__dict__['gx']

@gx.setter
def gx(self, value):
print "setting gx"
self.__dict__['gx'] = value

def __setattr__(self, attr, value):
print "using setattr"
object.__setattr__(self, attr, value)

t = Test()
t.gx = 4
t.dummy = 5
print t.gx
print t.dummy

print dir(Test)

输出

using setattr
setting gx
getting gx
using setattr
4
5
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gx']

我不知道为什么你的版本会调用 getter 两次。这个没有。此外,要回答有关描述符所在位置的问题,您可以清楚地将其视为类字典中的最后一个条目。

值得注意的是,您不需要 __setattr__ 来执行示例中的操作。 Python 总是将赋值 foo.bar = x 写入 foo.__dict__['bar'] = x 而不管 foo.__dict__< 中是否有条目 或不。 __setattr__ 适用于当您想要转换值或记录分配或类似内容时。

关于python - 我需要定义 __setattr__ 来分配没有属性的字段,但对定义了属性的字段使用 setter/getter 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4772095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com