__str__当类具有描述符时遇到RecursionError

时间:2018-10-31 01:10:27

标签: python

代码如下所示。我只知道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)

1 个答案:

答案 0 :(得分:0)

  • __set__中打印实例。
  • 您实例的__str__尝试__get__的某些属性
  • 会再次调用print
    • 隐式调用(和__str__

然后循环重复。

如果删除print函数(或将__str__更改为不调用描述符),则应该可以。