簡體   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