有没有办法检查 属性 是否有 setter?

Is there a way to check if a property has a setter?

Python 3.X 中是否有一种方法可以检查 class 是否为其属性之一定义了 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) returns False 而我们可能认为它应该是 True 因为它是一种方法)。

您可以测试.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).

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