我正在编写一个python类来存储数据,然后另一个类将创建该类的实例来打印不同的变量。某些类变量需要大量格式化,这可能需要多行代码才能使其处于“最终状态”。
使用这种结构从类外部访问变量是不好的做法吗?
class Data():
def __init__(self):
self.data = "data"
或者使用@property方法访问变量是更好的做法吗?
class Data:
@property
def data(self):
return "data"
答案 0 :(得分:6)
小心,如果你这样做:
class Data:
@property
def data(self):
return "data"
d = Data()
d.data = "try to modify data"
会给你错误:
AttributeError:无法设置属性
正如我在您的问题中所看到的,您希望能够将数据转换为最终状态,因此,请选择其他选项
class Data2():
def __init__(self):
self.data = "data"
d2 = Data2()
d2.data = "now I can be modified"
或修改previus:
class Data:
def __init__(self):
self._data = "data"
@property
def data(self):
return self._data
@data.setter
def data(self, value):
self._data = value
d = Data()
d.data = "now I can be modified"
答案 1 :(得分:4)
Python中的常规做法是直接暴露属性。如果在获取或设置时需要执行其他操作,则可以稍后添加属性。
标准库中的大多数模块都遵循这种做法。公共变量(不带下划线)通常不使用 property(),除非有特定原因(例如将属性设为只读)。
普通属性访问(没有属性)易于实现,易于理解,运行速度非常快。
之后使用 property()的可能性意味着我们不必练习defensive programming。我们可以避免过早地实现getter和setter,这会使代码膨胀并使访问速度变慢。
答案 2 :(得分:1)
基本上,您可以隐藏属性中的大量复杂性并使其看起来像属性。这增加了代码的可读性。
此外,您需要了解属性和属性之间的区别。 请参阅What's the difference between a Python "property" and "attribute"?