繁体   English   中英

对多个属性使用描述符(编辑:不是单个装饰器)吗?

[英]Use a Descriptor (EDIT: Not a single decorator) for multiple attributes?

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

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

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

def bool1():
    def get_boo1():
        return self._bool1
    def set_bool1(self,value):
        if value <> True and value <> False:
            print "bool1 not a boolean value. exiting"
            exit()
        self._bool1=value
    return locals()
bool1 = property(**bool1())

#same thing for bool2, bool3, etc...

我试图写成这样的东西:

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

关于如何正确执行操作的任何指示?

谢谢,

保罗

您可以尝试使用描述符

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读取的内容)必须进行范围检查,而不是类型检查。 读取外部数据的应用程序部分定义了类型。 无需检查类型。 不会有任何谜团。

“如果我使用了错误的类型,并且我的程序似乎可以运行但没有运行,该怎么办”的情况实际上没有任何意义。 首先,找到线下行为相同但结果略有不同的两种类型。 唯一的例子是int vs. float ,唯一真正重要的是围绕除法,这由两个除法运算符负责。

如果您“偶然”使用了需要输入数字的字符串,则程序将死亡。 可靠。 始终如一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM