如何解决检查属性是否可设置/可删除
| 如何检查Python中的属性是否可设置或可删除? 到目前为止,我发现的最好的是type(obj).__dict__[\"prop_name\"].fset is not None
解决方法
当您应该订阅“比权限更容易获得宽恕”的哲学时,这是一个很好的情况,并且仅在无法设置/删除属性的情况下处理异常。
try:
x.prop = 42
except AttributeError:
pass
,我认为没有任何尝试就可以知道的方法。您无法确定对象是否具有奇怪的ѭ2或类似的东西会破坏您尝试使用的抽象。
,下面的程序测试了三个函数,这些函数旨在确定类或实例属性是否支持CRUD操作。类或实例是can_*
函数的第一个参数,第二个参数是应检查的属性的名称。类型检查会自动完成,以确保按预期使用功能。请注意,这仅设计用于使用由builtins
模块中的property
类创建的属性。
#! /usr/bin/env python3
def main():
for kind in Test,TestG,TestS,TestGS,TestD,TestGD,TestSD,TestGSD:
print(kind.__name__,\'Class\')
print(\' can_get:\',can_get(kind,\'data\'))
print(\' can_set:\',can_set(kind,\'data\'))
print(\' can_del:\',can_del(kind,\'data\'))
print()
instance = kind(\'Hello,world!\')
print(kind.__name__,\'Instance\')
print(\' can_get:\',can_get(instance,can_set(instance,can_del(instance,\'data\'))
print()
def can_get(obj,key):
return _get_property(obj,key).fget is not None
def can_set(obj,key).fset is not None
def can_del(obj,key).fdel is not None
def _get_property(obj,key):
if not isinstance(obj,type):
obj = type(obj)
pro = vars(obj).get(key)
if not isinstance(pro,property):
raise TypeError(\'{.__name__}.{} is not a property\'.format(obj,key))
return pro
class Test:
def __init__(self,value):
self.__data = value
def get_data(self):
return self.__data
def set_data(self,value):
self.__data = value
def del_data(self):
del self.__data
data = property()
class TestG(Test):
data = property(fget=Test.get_data)
class TestS(Test):
data = property(fset=Test.set_data)
class TestGS(Test):
data = property(fget=Test.get_data,fset=Test.set_data)
class TestD(Test):
data = property(fdel=Test.del_data)
class TestGD(Test):
data = property(fget=Test.get_data,fdel=Test.del_data)
class TestSD(Test):
data = property(fset=Test.set_data,fdel=Test.del_data)
class TestGSD(Test):
data = property(fget=Test.get_data,fset=Test.set_data,fdel=Test.del_data)
if __name__ == \'__main__\':
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。