什么时候需要属性而不是仅仅在 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
只会在类被实例化时被评估。更改length
或width
的值不会修改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 的 os 模块方法而不是直接执行 shell 命令?