Python class 变量或@属性
Python class variables or @property
我正在写一个 python class 来存储数据,然后另一个 class 将创建一个 class 的实例来打印不同的变量。一些 class 变量需要大量格式化,这可能需要多行代码才能将其放入 "final state".
使用这种结构仅从 class 外部访问变量是不好的做法吗?
class Data():
def __init__(self):
self.data = "data"
还是使用@属性 方法访问变量更好?
class Data:
@property
def data(self):
return "data"
小心,如果你这样做:
class Data:
@property
def data(self):
return "data"
d = Data()
d.data = "try to modify data"
会给你报错:
AttributeError: can't set attribute
正如我在你的问题中看到的那样,你希望能够转换数据直到它的最终状态,所以,选择另一个选项
class Data2():
def __init__(self):
self.data = "data"
d2 = Data2()
d2.data = "now I can be modified"
或修改前文:
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"
基本上,您可以在 属性 中隐藏很多复杂性,并使其看起来像一个属性。这增加了代码的可读性。
此外,您需要了解属性和属性之间的区别。
请参考What's the difference between a Python "property" and "attribute"?
常见做法
Python中的常规做法是直接暴露属性。如果在获取或设置时需要额外操作,可以稍后添加 属性。
标准库中的大部分模块都遵循这种做法。 Public 变量(不带下划线前缀)通常不使用 属性() 除非有特定原因(例如将属性设置为只读).
理由
普通属性访问(无属性)实现简单,易于理解,运行速度非常快。
以后可以用属性()意味着我们不用练习defensive programming。我们可以避免过早地实现 getter 和 setter,这会使代码膨胀并使访问变慢。
我正在写一个 python class 来存储数据,然后另一个 class 将创建一个 class 的实例来打印不同的变量。一些 class 变量需要大量格式化,这可能需要多行代码才能将其放入 "final state".
使用这种结构仅从 class 外部访问变量是不好的做法吗?
class Data():
def __init__(self):
self.data = "data"
还是使用@属性 方法访问变量更好?
class Data:
@property
def data(self):
return "data"
小心,如果你这样做:
class Data:
@property
def data(self):
return "data"
d = Data()
d.data = "try to modify data"
会给你报错:
AttributeError: can't set attribute
正如我在你的问题中看到的那样,你希望能够转换数据直到它的最终状态,所以,选择另一个选项
class Data2():
def __init__(self):
self.data = "data"
d2 = Data2()
d2.data = "now I can be modified"
或修改前文:
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"
基本上,您可以在 属性 中隐藏很多复杂性,并使其看起来像一个属性。这增加了代码的可读性。
此外,您需要了解属性和属性之间的区别。 请参考What's the difference between a Python "property" and "attribute"?
常见做法
Python中的常规做法是直接暴露属性。如果在获取或设置时需要额外操作,可以稍后添加 属性。
标准库中的大部分模块都遵循这种做法。 Public 变量(不带下划线前缀)通常不使用 属性() 除非有特定原因(例如将属性设置为只读).
理由
普通属性访问(无属性)实现简单,易于理解,运行速度非常快。
以后可以用属性()意味着我们不用练习defensive programming。我们可以避免过早地实现 getter 和 setter,这会使代码膨胀并使访问变慢。