有没有办法检查 属性 是否有 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 是否定义的方法。
以下是我考虑过但没有成功的两条途径:
- 使用
hasattr
查找是否存在名为 my_property.setter
或类似名称的方法。
- 使用
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 级别而不是在单个实例上调用它们。
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 是否定义的方法。
以下是我考虑过但没有成功的两条途径:
- 使用
hasattr
查找是否存在名为my_property.setter
或类似名称的方法。 - 使用
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 级别而不是在单个实例上调用它们。