gpt4 book ai didi

Python,如何在作为重载方法的类的一部分的字典对象上使用 __setattr__ ?

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:13 30 4
gpt4 key购买 nike

如下面的代码所示,为什么我不能使用 __setattr__ 在作为重载方法的类的一部分的字典上设置值?我预计 b.hello 不会存在。

class MyClass():

datastore = {}

def __init__(self):
self.datastore = {}

def __getattr__(self, key):
return self.datastore[key]

def __setattr__(self, key, value):
self.datastore[key] = value

a = MyClass()
b = MyClass()

a.hello = "err"

print a.hello # err
print b.hello # err

最佳答案

b.hello 打印您的字符串“err”,因为 datastore 是类本身的属性,而不是类对象的属性。因此,当你在a中初始化它时,b也可以访问它。

因此,从类中删除 datastore = {}

此外,来自 Python docs :

if __setattr__() wants to assign to an instance attribute, it should not simply execute self.name = value — this would cause a recursive call to itself. Instead, it should insert the value in the dictionary of instance attributes, e.g., self.__dict__[name] = value. For new-style classes, rather than accessing the instance dictionary, it should call the base class method with the same name, for example, object.__setattr__(self, name, value).

因此,将您的代码更改为:

class MyClass(object): # Use new style classes
def __init__(self):
object.__setattr__(self, 'datastore', {}) # This prevents infinite recursion when setting attributes

def __getattr__(self, key):
return self.datastore[key]

def __setattr__(self, key, value):
self.datastore[key] = value

a = MyClass()
b = MyClass()

a.hello = "err"

print a.hello # Works
print b.hello # Gives an error

关于Python,如何在作为重载方法的类的一部分的字典对象上使用 __setattr__ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171289/

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