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

Bor*_*jaX 0 python oop etiquette private-members

我有一个关于在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
Run Code Online (Sandbox Code Playgroud)

现在让我们说下面几行,在同一个类的另一个方法中,我需要重新设置"_ private1"的值.由于它是同一个类,我仍然可以直接访问private属性self._private1.

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

self.setPrivate1("privateBlaBlaBla")
Run Code Online (Sandbox Code Playgroud)

或者我应该直接访问:

self.__private1 ="privateBlaBlaBla"
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Kat*_*iel 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
Run Code Online (Sandbox Code Playgroud)

侧面注释 - 使用双下划线名称可能会令人困惑,因为Python实际上会破坏名称以阻止您从类外部访问它们.这没有提供真正的安全性,但不会导致头痛.避免头痛的最简单方法是使用单下划线名称,这基本上是一种普遍的约定private.(ISH).


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