class Person():
def __init__(self,name:str,height :float) -> None:
#initialize
self.__name=name
self.height=height
@property
def name(self) -> str:
print("Inside Getter")
return self.__name
@name.setter
def name(self, value):
print("New name being set")
self.name = value
def __repr__(self) -> str:
return f"({self.__class__.__name__}:{self.name},{self.height})"
p=Person("Sam",180.00)
print(p)
1.在上面的代码中,当我在 repr() 方法中不使用双下划线访问名称时,它会调用 getter,然后调用 repr()。我不明白为什么这里会调用 getter。 (当我在 repr() 中使用双下划线时,代码按预期工作,仅执行 repr() )
上述代码的输出是:
内部吸气剂
(人:Sam,180.0)
------------------------------------------------- -------------------------------------------------- --------------------------
2.稍微修改一下上面的代码,当我也从 getter() 中删除双下划线时(现在 getter() 和 repr() 都没有双下划线了)
def name(self) -> str:
print("Inside Getter")
return self.name
我最终遇到了递归错误。这里是如何进行递归的?
名义上 print("吸气剂内部") RecursionError:调用 Python 对象时超出最大递归深度
关于递归,当你访问
self.name
时,你实际上是在调用属性
@property
def name(self) -> str:
print("Inside Getter")
return self.__name
因此,如果您尝试访问
self.name
within 属性,您将设置一个递归循环。
通常,您可以使用
self.__name
属性来存储要在 getter 和 setter 后面混淆的数据,因此您的类将如下所示:
class Person():
def __init__(self, name:str, height:float) -> None:
self.__name = name
self.height = height
@property
def name(self) -> str:
return self.__name # Get self.__name
@name.setter
def name(self, value):
self.__name = value # Set self.__name
def __repr__(self) -> str:
return f"({self.__class__.__name__}:{self.name},{self.height})"