在Python中,为什么从getter()访问私有属性时会以递归结束,而不在getter()中使用双下划线

问题描述 投票:0回答:1
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 对象时超出最大递归深度

python oop getter-setter encapsulation private-members
1个回答
0
投票

关于递归,当你访问

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})"
© www.soinside.com 2019 - 2024. All rights reserved.