在有getter/setter的情况下访问私有变量

2024-10-01 22:38:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于用Python编程的正确方式的问题。。。这里可能有几种不同的观点:

假设我有一个具有两个私有属性的类,并且实现了两个getter/setter(不是重载__getattr__和{},而是一种更“Java-tistic”风格):

class MyClass:

    def __init__(self):   
        self.__private1 = "Whatever1"

    def setPrivate1(self, private1):
        if isinstance(private1, str) and (private1.startswith("private")):
            self.__private1 = private1
        else:
            raise AttributeError("Kaputt")

    def getPrivate1(self):
        return self.__private1

现在让我们看下面几行,在同一类的另一个方法中,我需要重新设置“private1”的值。因为它是同一个类,我仍然可以直接访问私有属性self。私人的。在

我的问题是:我是否应该使用:

^{pr2}$

或者我应该直接访问:

self.__private1 ="privateBlaBlaBla"

因为我是设置新值的人,所以我知道所说的值(“privateBlaBlaBla”)是正确的(以“private”开头的str()),所以它不会使系统不一致。另一方面,如果另一个程序员拿走了我的代码,并且需要更改self.\u private1属性的功能,那么他将需要遍历所有代码,并查看是否在其他地方手动设置了\uu private1的值。在

我的猜测是正确的做法是始终使用setPrivate1方法,并且只直接访问get/set中的\uuu private1变量,但是我想知道更有经验的Python程序员的意见。在

谢谢你!在


Tags: 方法代码self属性def编程方式private
2条回答

你不能提出一个坏Python的经典例子,然后期望人们对如何处理它有意见。使用getter和setters。在

class MyClass:
    def __init__(self):   
        self._private1 = "Whatever1"

    @property
    def private1(self):
        return self._private1

    @private1.setter
    def private1(self, value):
        self._private1 = value

使用双下划线名称的旁注可能会令人困惑,因为Python实际上会篡改名称以阻止您从类外部访问它们。这并不能提供真正的安全性,但会带来无尽的麻烦。避免这些麻烦的最简单方法是使用单下划线名称,这基本上是private的通用约定。(嘘)


如果您需要意见,请使用properties=)。如果你想对你的JavaPython怪物有什么看法,我会用setter毕竟,你已经写了它,这就是它的用途!手动设置变量没有明显的好处,但是有几个缺点。在

都不是。In Python, use properties,不是getter和setters。在

class MyClass:

    def __init__(self):   
        self._private1 = "Whatever1"
    @property
    def private1(self):
        return self._private1
    @private1.setter
    def private1(self, private1):
        if isinstance(private1, str) and (private1.startswith("private")):
            self._private1 = private1
        else:
            raise AttributeError("Kaputt")

然后在稍后的代码中,使用

^{pr2}$

相关问题 更多 >

    热门问题