当有针对它们的getter / setter时访问私有变量

时间:2010-10-26 16:47:34

标签: oop python private-members etiquette

我对Python中正确的编程方式有疑问......也许可以有几种不同的意见,但在这里:

假设我有一个包含几个私有属性的类,并且我已经实现了两个getter / setter(没有重载__getattr____setattr__,但是更加“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。 _private1。

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

self.setPrivate1("privateBlaBlaBla")

或者我应该直接访问:

self.__private1 ="privateBlaBlaBla"

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

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

谢谢!

2 个答案:

答案 0 :(得分:6)

你不能提出一个关于坏Python的经典例子,然后期望人们对它的作用有所了解。使用getter和setter。

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的通用约定。 (ISH)。


如果你想要一个意见 - 使用properties =)。如果你想对你的JavaPython怪物有所了解,我会使用setter - 毕竟,你已经写过它了,那就是它的用途!手动设置变量没有明显的好处,但有几个缺点。

答案 1 :(得分:2)

都不是。 In Python, use properties,而非吸气者和二传手。

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")

然后在您的代码中,使用

设置_private1属性
self.private1="privateBlaBlaBla"