我对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程序员的意见。
谢谢!
答案 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"