【问题标题】:Safe to use property names inside class methods?在类方法中使用属性名称安全吗?
【发布时间】: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


【解决方案1】:

好的,我不确定这里有没有好的解决方案,所以我将采用不同的选择:如果用户试图做某事弄乱一切,那是他们自己的错。毕竟,Python 是“一种供成年人自愿使用的语言”。

仅仅因为一个属性在 PEP 8 标准中通常是“公共的”,这并不意味着一个类的用户可以对它的属性做任何他们想做的事情,无论是替换它们的值,改变它们,甚至删除它们。这自然也适用于作为类属性的属性。

我会暂时搁置这个问题,但我相当肯定这种态度是解决这个“问题”的正确方法。

【讨论】:

  • 我不确定需要记录多少。作为类的公共 API 的一部分的 property 通常应该被假定为表面上像实例变量一样工作。通过类(而不是实例)对属性做任何事情都会弄乱实现细节。这不是被禁止的,因此有充分理由与实现的内部(可能是测试代码)混为一谈的代码可以做任何它想做的事情,但这种交互不需要作为公共 API 的一部分来支持。跨度>
  • 是的,这是真的。我喜欢你的推理。
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多