假设我们有一个类,在创建后的某个时刻需要为其分配一个值:
class ProcStatus:
def __init__(self, name):
self.name = name
self._status_code = None
def set_status_code(self, value):
self._status_code = value
def print_proc_status(self): # Some function that does something with the status code
print(f'{self.name} returned code {self._status_code}')
status = ProcStatus('ls')
# Some code in between
status.set_status_code(1)
status.print_proc_status()
使用这种设计,通过界面可以清楚地看出调用者可以(并且鼓励)显式设置状态代码。然而,更Pythonic的方法是使用属性:
class ProcStatus:
def __init__(self, name):
self.name = name
self.status_code = None
def print_proc_status(self): # Some function that does something with the status code
print(f'{self.name} returned code {self.status_code}')
status = ProcStatus('ls')
# Some code in between
status.status_code = 1
status.print_proc_status()
第二个设计是否更好,尽管看起来有点误导,因为 status_code
在类中从未更新?或者,分配给私有(private)字段的属性 setter 和 getter 是正确的方法吗?
最佳答案
为变量设置 setter 和 getter 的实用性在于,它们可以强制执行一些约束或维护用户为字段设置的值的类不变量 - 换句话说,它们允许您“清理”其他可能任意的值。
实现两全其美的最Pythonic方法(您的示例#1和#2)是使用@property
装饰器,它看起来像:
class ProcStatus:
def __init__(self, name):
self.name = name
self._status_code = None
@property
def status_code(self):
print("Getting")
return self._status_code
@property.setter
def status_code(self, value):
print("Setting")
# maybe apply constraints, check `value` for validity
self._status_code = value
现在您可以享受 setter 和 getter 的额外好处以及 status.status_code = 1
或 print(status.status_code)
的优点
关于python - 在 Python 中定义未更改的公共(public)变量是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329747/