【发布时间】:2016-10-16 03:02:23
【问题描述】:
给定一个具有只读属性的类,可以很容易地修改它:
cls.prop_name = property(cls.prop_name.fget, my_setter)
但是,可以del cls.prop_name 或像我一样更改它。 PEP 8 认为这是可以接受的,其中指出 prop_name 是一个公共属性,因此该类的任何用户都可以使用他们喜欢的任何内容,类似于仅修改我直接隐藏在属性后面并绕过的非公共属性我可能创建的任何检查,例如将 RGB 组件的值限制在 0..255 范围内。
根据 PEP 8,如果属性名称以下划线开头,这将是一个坏主意,但事实并非如此,因此可以以某种方式删除或修改属性。这正是属性旨在防止的事情,但通过删除或以其他方式更改属性,人们可以覆盖我的行为,如上所示。
这引出了我的问题:我应该只在类中使用非公共的验证 setter 方法并将其简单地用作属性设置器,还是应该使用公共的 setter 方法,因为验证非公开的新值公共属性不是属性的预期用途吗?我试图避免代码重复,所以这实际上是我仅有的两个选项,允许用户访问,同时在属性设置器或设置器方法的情况下验证值。
有人对这类问题有任何经验吗?如果解决了,您是如何解决的?
【问题讨论】:
-
PEP8 说可以
del类属性?我不记得了。您还可以del进行其他操作,例如类级别的变量和方法。这些可能会带来灾难性的后果。我看不出属性有什么额外需要担心的。你给了程序员一根绳子,如果他最终从椽子上荡来荡去,那就这样吧! -
@tdelaney 更像 PEP8 并没有明确禁止它。这只是一个例子,我很难说它是一个好例子。话又说回来,在 Python 中你应该遵守约定(因为我们都是成年人,对吧?)但是,正是这些约定让我质疑在这种情况下我应该做什么。
标签: python properties