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程序员的意见.
谢谢!
你不能提出一个关于坏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 - 毕竟,你已经写过它了,那就是它的用途!手动设置变量没有明显的好处,但有几个缺点.