对多个属性使用描述符(编辑:不是一个修饰符)?

2024-09-29 23:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 2.5.4。对Python来说还是个新手,昨晚对装修师来说还是全新的。如果我有一个具有多个布尔属性的类:

class Foo(object):
    _bool1 = True
    _bool2 = True
    _bool3 = True
    #et cetera

    def __init__():
        self._bool1 = True
        self._bool2 = False
        self._bool3 = True
        #et cetera

有没有一种方法可以使用一个修饰符来检查任何布尔属性的设置是否必须是布尔值,并为这些变量中的任何一个返回布尔值?在

换句话说,相对于每个属性都是这样的?在

^{pr2}$

我试过这样写:

def stuff(obj):
    def boolx():
        def fget(self):
            return obj
        def fset(self, value):
            if value <> True and value <> False:
                print "Non-bool value" #name of object???
                exit()
            obj = value
        return locals()
    return property(**boolx())

bool1 = stuff(_bool1)
bool2 = stuff(_bool2)
bool3 = stuff(_bool3)

这给了我:

File "C:/PQL/PythonCode_TestCode/Tutorials/Decorators.py", line 28, in stuff
    return property(**boolx())
TypeError: 'obj' is an invalid keyword argument for this function

关于如何正确地做这件事有什么建议吗?在

谢谢

保罗


Tags: selftrueobjreturn属性objectvaluedef
2条回答

您可以尝试使用descriptor

class BooleanDescriptor(object):
    def __init__(self, attr):
        self.attr = attr

    def __get__(self, instance, owner):
      return getattr(instance, self.attr)

    def __set__(self, instance, value):
      if value in (True, False):
        return setattr(instance, self.attr, value)
      else:
        raise TypeError


class Foo(object):
    _bar = False
    bar = BooleanDescriptor('_bar')

编辑:

正如S.Lott提到的,python更喜欢Duck Typing而不是类型检查。在

两件重要的事。在

首先,“类级别”属性由类的所有实例共享。就像Java中的static。你的问题不清楚你是否真的在谈论类级别的属性。在

一般来说,大多数OO编程都是用实例变量完成的,就像这样。在

class Foo(object):
    def __init__():
        self._bool1 = True
        self._bool2 = False
        self._bool3 = True
        #et cetera

第二点。我们不会浪费很多时间来验证参数的类型。在

如果一个神秘的“某人”提供了错误的数据类型,我们的类就会崩溃,这几乎是最好的结果。在

为了让类在不同的地方崩溃,在类型和域验证上大惊小怪是一件很费事的事。最终,异常(TypeError)是相同的,因此额外的检查结果没有什么实际价值。在

实际上,当有人创建bool的替代实现,并且您的类拒绝这个完全有效的类,该类具有与内置的bool相同的功能时,额外的域检查可能(而且经常会)适得其反。在

不要将人工输入范围检查与Python类型检查混为一谈。人工输入(或从文件或URI中读取的内容)必须range选中,但不能进行类型检查。执行外部数据读取的应用程序部分定义了类型。不需要检查类型。不会有什么神秘的。在

“如果我使用了错误的类型,而我的程序似乎可以工作,但没有用呢”的场景实际上没有任何意义。首先,找出两种行为完全相同但结果略有不同的类型。唯一的例子是intfloat,唯一真正重要的是除法,这由两个除法运算符处理。在

如果你“不小心”使用了一个需要数字的字符串,你的程序就会死掉。可靠。一贯地。在

相关问题 更多 >

    热门问题