gpt4 book ai didi

python - 我可以执行哪些测试来确保我已正确覆盖 __setattr__?

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:29 24 4
gpt4 key购买 nike

我研究 Python 已经有一段时间了,我开始明白正确覆盖 __setattr__ 可能很麻烦(to say the least !)。

有哪些有效的方法可以确保/向我自己证明覆盖已正确完成?我特别关心确保覆盖与描述符协议(protocol)和 MRO 保持一致。

(标记为 Python 3.x,因为这是我正在使用的,但这个问题当然也适用于其他版本。)

“覆盖”表现出默认行为的示例代码(但我如何证明这一点?):

class MyClass():
def __setattr__(self,att,val):
print("I am exhibiting default behavior!")
super().__setattr__(att,val)

覆盖违反描述符协议(protocol)的人为示例(实例存储查找发生在描述符查找之前 - 但我如何测试它?):

class MyClass():
def __init__(self,mydict):
self.__dict__['mydict'] = mydict
@property
def mydict(self):
return self._mydict
def __setattr__(self,att,val):
if att in self.mydict:
self.mydict[att] = val
else:
super().__setattr__(att, val)

理想的答案将提供一个通用测试,该测试将在 __setattr__ 被正确覆盖时成功,否则失败。

最佳答案

在这种情况下,有一个简单的解决方案:添加一个绑定(bind)描述符,其名称位于 mydict 中,并测试分配给该名称的是否通过描述符(注意:Python 2.x 代码,我不知道'在此处安装 Python 3):

class MyBindingDescriptor(object):
def __init__(self, key):
self.key = key

def __get__(self, obj, cls=None):
if not obj:
return self
return obj.__dict__[self.key]

def __set__(self, obj, value):
obj.__dict__[self.key] = value


sentinel = object()

class MyClass(object):
test = MyBindingDescriptor("test")

def __init__(self, mydict):
self.__dict__['mydict'] = mydict
self.__dict__["test"] = sentinel

def __setattr__(self, att, val):
if att in self.mydict:
self.mydict[att] = val
else:
super(MyClass, self).__setattr__(att, val)


# first test our binding descriptor
instance1 = MyClass({})
# sanity check
assert instance1.test is sentinel, "instance1.test should be sentinel, got '%s' instead" % instance1.test

# this one should pass ok
instance1.test = NotImplemented
assert instance1.test is NotImplemented, "instance1.test should be NotImplemented, got '%s' instead" % instance1.test

# now demonstrate that the current implementation is broken:
instance2 = MyClass({"test":42})
instance2.test = NotImplemented
assert instance2.test is NotImplemented, "instance2.test should be NotImplemented, got '%s' instead" % instance2.test

关于python - 我可以执行哪些测试来确保我已正确覆盖 __setattr__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27399567/

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