微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查属性是否可设置/可删除

如何解决检查属性是否可设置/可删除

| 如何检查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 举报,一经查实,本站将立刻删除。