Python类变量或@property

APo*_*031 8 python properties getter-setter

我正在编写一个python类来存储数据,然后另一个类将创建该类的实例来打印不同的变量.某些类变量需要大量格式化,这可能需要多行代码才能使其处于"最终状态".

使用这种结构从类外部访问变量是不好的做法吗?

class Data():
    def __init__(self):
        self.data = "data"
Run Code Online (Sandbox Code Playgroud)

或者使用@property方法访问变量是否更好?

class Data:
    @property
    def data(self):
        return "data"
Run Code Online (Sandbox Code Playgroud)

Dam*_*ero 6

如果你这样做,要小心:

class Data:
    @property
    def data(self):
        return "data"

d = Data()
d.data = "try to modify data"
Run Code Online (Sandbox Code Playgroud)

会给你错误:

AttributeError:无法设置属性

正如我在您的问题中看到的那样,您希望能够将数据转换为最终状态,因此,请选择其他选项

class Data2():
    def __init__(self):
        self.data = "data"

d2 = Data2()
d2.data = "now I can be modified"
Run Code Online (Sandbox Code Playgroud)

或修改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"
Run Code Online (Sandbox Code Playgroud)


Ray*_*ger 5

普通做法

Python的正常做法是直接公开属性。如果在获取或设置时需要执行其他操作,则可以在以后添加属性。

标准库中的大多数模块都遵循这种做法。除非有特殊原因(例如将属性设置为只读),否则公共变量(不带下划线前缀)通常不使用property()。

基本原理

普通属性访问(不带属性)易于实现,易于理解并且运行速度非常快。

之后使用property()的可能性意味着我们不必练习防御性编程。我们可以避免过早实现getter和setter方法,这些方法会使代码膨胀并使访问速度变慢。