gpt4 book ai didi

python - 当类有描述符时 __str__ 遇到 RecursionError

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

代码如下所示。我只知道 RecursionError 的原因是 student.ageDescriptor 中以无限循环调用 __get__ 。但是,我既不知道根本原因,也不知道解决方案。

我该如何解决这个问题?

class Descriptor(object):
def __init__(self, name):
self.name = name

def __get__(self, instance, owner):
print(f"get::instance={instance}, owner={owner}")
if instance is None:
pass
return instance.__dict__[self.name]

def __set__(self, instance, value):
print(f"set::instance={instance}, value={value}")
instance.__dict__[self.name] = value

def __delete__(self, instance):
print(f"delete::instance={instance}")
del instance.__dict__[self.name]

class Student(object):
name = Descriptor("name")
school = Descriptor("school")

def __init__(self, name, school, age):
self.name = name
self.school = school
self.age = age

# self.school will call Descriptor.__get__(student, Student),
# so nfinite loop?
def __str__(self):
return f"Student::name={self.name}, school={self.school}, age={self.age}"


if __name__ == "__main__":
s = Student("Yannick", "HUST", "30")
print(s.age)

最佳答案

  • __set__ 中打印实例。
  • 您的实例的 __str__ 尝试 __get__ 某些属性
  • 调用另一个print调用
    • 隐式调用(和__str__)

然后循环重复。

如果您删除 print 函数(或更改您的 __str__ 以不调用描述符),那么应该没问题。

关于python - 当类有描述符时 __str__ 遇到 RecursionError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53074919/

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