0

Python2.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

単一のデコレータを使用して、ブール属性のいずれかの設定がブールでなければならないことを確認し、これらの変数の要求された1つのブール値を返す方法はありますか?

言い換えれば、属性ごとにこのようなものとは対照的に?

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

これを正しく行う方法についての指針はありますか?

ありがとう、

ポール

4

2 に答える 2

3

記述子を使用してみることができます:

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は型チェックよりもダックタイピングを好みます。

于 2009-11-10T14:44:42.580 に答える
2

2つの重要なこと。

まず、「クラスレベル」の属性は、クラスのすべてのインスタンスで共有されます。staticJavaのように。あなたが本当にクラスレベルの属性について話しているのかどうかは、あなたの質問からは明らかではありません。

一般に、ほとんどのオブジェクト指向プログラミングは、このようなインスタンス変数を使用して行われます。

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

2点目。引数のタイプを検証するのに多くの時間を無駄にすることはありません。

不思議な「誰か」が間違った型のデータを提供すると、クラスがクラッシュし、それが可能な限り最良の結果になります。

タイプとドメインの検証をいじくり回すのは、クラスを別の場所でクラッシュさせるための多くの作業です。最終的に、例外(TypeError)は同じであるため、追加のチェックにはほとんど実用的な価値がないことがわかります。

実際、誰かがの代替実装を作成し、boolクラスが組み込みと同じ機能をすべて備えたこの完全に有効なクラスを拒否すると、追加のドメインチェックが逆効果になる可能性があります(多くの場合、そうなります) bool

人間の入力範囲チェックとPythonタイプチェックを混同しないでください。人間の入力(またはファイルやURIから読み取ったもの)は範囲チェックする必要がありますが、タイプチェックはしないでください。外部データの読み取りを行うアプリケーションの一部がタイプを定義します。タイプを確認する必要はありません。謎はありません。

「間違ったタイプを使用し、プログラムが機能しているように見えても機能しなかった場合」のシナリオは、実際には意味がありません。まず、すぐに同じ動作をするが、結果がわずかに異なる2つのタイプを見つけます。唯一の例はintvs.floatであり、実際に問題となるのは除算の周りだけであり、それは2つの除算演算子によって処理されます。

数字が必要な場所で「誤って」文字列を使用すると、プログラムは終了します。確実に。一貫して。

于 2009-11-10T14:37:09.250 に答える