代码如下所示。我只知道RecursionError
的原因是student.age
在__get__
中被称为Descriptor
并具有无限循环。但是,我既不知道根本原因也不知道解决方案。
我该怎么办?
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)
答案 0 :(得分:0)
__set__
中打印实例。__str__
尝试__get__
的某些属性print
__str__
)然后循环重复。
如果删除print
函数(或将__str__
更改为不调用描述符),则应该可以。