什么时候需要属性而不是仅仅在 Python 中公开变量?

Posted

技术标签:

【中文标题】什么时候需要属性而不是仅仅在 Python 中公开变量?【英文标题】:When is a property needed instead of just exposing the variable in Python? 【发布时间】:2013-05-07 00:03:37 【问题描述】:

这是使用 Python 文档中给出的属性的示例:

Class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

据我所知,这就像一个常规的无属性实例变量:

Class D(object):
    def __init__(self):
        self.x = None

当然,这不能为 getter 或 setter 添加额外的逻辑,但是,由于其他代码与 C 和 D 交互的方式没有区别,因此如果需要,您可以随时添加属性无需破坏任何其他代码。

我知道如果您使用在类级别声明的可变类型,这会产生问题,即:

class E(object):
    x = [1,2,3]

但是,除了这种情况,在需要它们之前忽略这些属性是不好的做法,还是可以接受的?

谢谢!

【问题讨论】:

您所说的“在需要时忽略属性”是什么意思? 如果您需要在 getter 或 setter 中实际执行其他操作,请使用 D 类,然后将其更改为 C 类中的实现 当然。如果您不需要 getter 和 setter,请不要使用它们。它们只会使您的班级结构复杂化。另外,我会使用 @property 装饰器:***.com/questions/6304040/… 我会说相反 - 如果没有必要,将代码与属性混在一起是不好的做法 When and how to use the builtin function property() in python的可能重复 【参考方案1】:

您使用property 来评估作为其他属性功能的对象属性的值。考虑以下类:

class shape:
    def __init__(self,l,w):
        self.length = l
        self.width  = w
    @property
    def area(self):
        return self.length*self.width

如果我们更改长度或宽度的值,面积的值将在我们请求时立即更新。

[In:]  s = shape(2,3)

[In:]  print s.length, s.width, s.area
[Out:] 2 3 6

[In:]  s.length = 5

[In:]  print s.length, s.width, s.area
[Out:] 5 3 15

为帮助阐明其工作原理,请考虑以下情况:如果我们尝试在 __init__() 中定义 area

class shape2:
    def __init__(self,l,w):
        self.length = l
        self.width  = w
        self.area = self.length * self.width

area 只会在类被实例化时被评估。更改lengthwidth 的值不会修改area 的值:

[In:]  s = shape2(2,3)

[In:]  print s.length, s.width, s.area
[Out:] 2 3 6

[In:]  s.length = 5

[In:]  print s.length, s.width, s.area
[Out:] 5 3 6

【讨论】:

谢谢!我了解属性的用途,我只是想知道在简单的情况下是否需要它们。【参考方案2】:

我个人认为 Python 公开变量是其哲学的一部分,因此您无需为所有内容都创建属性。您可以使用属性为曾经是一个简单变量的内容添加逻辑,或者为了保持(客户端)代码的清洁。

C 之类的类在教程/文档之外毫无用处。

(这是我自己的观点。我不知道什么是“被认为是”不好的做法,因为我不是经验丰富的开发人员之类的)

【讨论】:

以上是关于什么时候需要属性而不是仅仅在 Python 中公开变量?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候需要 pytorch 自定义功能(而不仅仅是一个模块)?

为啥开发人员需要 PhantomJS 而不是仅仅使用一些测试框架?

Python调用函数问题?

为啥使用 Python 的 os 模块方法而不是直接执行 shell 命令?

Python中为什么推荐使用isinstance来进行类型判断?而不是type

为啥惰性变量/计算属性,而不仅仅是方法