【问题标题】:Is there a way to check if a property has a setter?有没有办法检查属性是否有设置器?
【发布时间】:2021-02-05 07:39:05
【问题描述】:

在 Python 3.X 中有没有办法检查一个类是否为其属性之一定义了 setter 方法?

假设我有以下示例:

class Test:
  def __init__(self):
    self._p = None

  @property
  def my_property(self):
    return self._p

  @my_property.setter
  def my_property(self, new_value):
    self._p = new_value

我可以检查my_property 是否用hasattr 定义,但我找不到检查setter 是否已定义的方法。

以下是我考虑过但没有成功的两种途径:

  1. 使用hasattr 查找名为my_property.setter 或类似名称的方法是否存在。
  2. 使用inspect.signature函数查看my_property方法是否有2个参数(self和new_value)。

我想这个问题的扩展答案也会考虑如何检测 getter 的存在(区分属性和 getter 方法,因为 callable(test.my_property) 在我们认为应该是时返回 False True 因为它是一种方法)。

【问题讨论】:

  • 如果属性不是property怎么办?可以设置它,但它没有setter。在这种情况下,您希望检查是肯定的(就好像它有一个 setter)还是否定的?
  • 相关:stackoverflow.com/questions/17330160/…(几乎是重复的,因为答案在接受的某处......)
  • “当我们认为它应该是 True 因为它是一种方法时)。” – 不,test.my_property 既不是方法也不是属性。 Test.my_property 是。

标签: python python-3.x setter


【解决方案1】:

您可以测试.fset属性是否为None

>>> Test.my_property.fset is not None  # has a setter
True
>>> Test.my_property.fdel is not None  # has no deleter
False

同样的方法你也可以测试它是否有一个getter(通过.fget)。要测试属性是否是属性,可以测试isinstance(Test.my_property, property)

确保始终在类级别而不是单个实例上调用它们。

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多