2009-07-06 12 views
27

Pythonにはオブジェクトのブール値があります。クラスに__len__メソッドがある場合、__len__()が0を返すようなすべてのインスタンスはブール値Falseとして評価されます(たとえば、空のリスト)。実際にPythonのオブジェクトのブール値

それは論理式で表示された場合は、すべての反復可能な、空のカスタムオブジェクトはFalseとして評価されます。

は今、私は属性barでクラスfooがあるとします。 、と言う、それはそうTrue if bar % 2 == 0Falseに評価されるように、どのように私は、その真理値を定義することができますか?例えば

myfoo = foo() 
myfoo.bar = 3 
def a(myfoo): 
    if foo: 
     print "spam" 
    else: 
     print "eggs" 

ので、a(myfoo)"eggs"を印刷しなければなりません。

+0

も参照してください: '__nonzero __()'だけでなく> = 3.0 Pythonでウィル '__nonzero__'仕事 –

答えて

34

__nonzero__のためにPythonのドキュメントを参照してください。 Pythonの< 3.0では

class foo(object): 
    def __nonzero__(self) : 
     return self.bar % 2 == 0 

def a(foo): 
    if foo: 
     print "spam" 
    else: 
     print "eggs" 

def main(): 
    myfoo = foo() 
    myfoo.bar = 3 
    a(myfoo) 

if __name__ == "__main__": 
    main() 
38

あなたが望むものを達成するために__nonzero__を使用する必要があります。ブール値のコンテキストでオブジェクトを評価するときにPythonによって自動的に呼び出されるメソッドです。評価する値として使用される論理値を返す必要があります。

例えば:パイソン=> 3.0で

class Foo(object): 

    def __init__(self, bar) : 
     self.bar = bar 

    def __nonzero__(self) : 
     return self.bar % 2 == 0 

if __name__ == "__main__": 
    if (Foo(2)) : print "yess !" 

同じこと、方法を除いては、はるかに明白__bool__に変更されました。

+4

? – Wolf

+1

@Wolf、それはできません。 – Hammerite

関連する問題