web-dev-qa-db-ja.com

カスタムクラスのbool()のオーバーライド

私が欲しいのは、bool(myInstance)がFalseを返すことだけです(そして、myInstanceがif/or/andなどの条件付きの場合にFalseと評価されます。>、<、=をオーバーライドする方法を知っています)

私はこれを試しました:

class test:
    def __bool__(self):
        return False

myInst = test()
print bool(myInst) #prints "True"
print myInst.__bool__() #prints "False"

助言がありますか?

(Python 2.6を使用しています)

51
Ponkadoodle

これはPython 2.xまたはPython 3.x?の場合Python 2.xの場合、オーバーライドしようとしています__nonzero__代わりに。

class test:
    def __nonzero__(self):
        return False
66
Joe Holloway

コードをpython3との上位互換性を維持したい場合は、次のようにすることができます

class test:
    def __bool__(self):
        return False
    __nonzero__=__bool__
59
John La Rooy

testクラスがリストに似ている場合、___len___を定義し、bool(myInstanceOfTest)は、1個以上のアイテム(空でないリスト)がある場合はTrueを返し、0個のアイテム(空のリスト)がある場合はFalseを返します。これでうまくいきました。

_class MinPriorityQueue(object):
    def __init__(self, iterable):
        self.priorityQueue = heapq.heapify(iterable)
    def __len__(self):
        return len(self.priorityQueue)

>>> bool(MinPriorityQueue([])
False
>>> bool(MinPriorityQueue([1,3,2])
True
_
9
IceArdor

John La Rooyと同様に、私は次のものを使用します。

class Test(object):
    def __bool__(self):
        return False

    def __nonzero__(self):
        return self.__bool__()
2
tknickman

[これは@ john-la-rooyからの回答に対するコメントですが、まだコメントすることはできません:)]

Python3との互換性のために、実行できます(これを探していました)

class test(object):
    def __bool__(self):
        return False

    __nonzero__=__bool__

唯一の問題は、サブクラスで__nonzero__ = __bool__を変更するたびに__bool__を繰り返す必要があることです。それ以外の場合、__nonzero__はスーパークラスから保持されます。あなたが試すことができます

from builtins import object  # needs to be installed !

class test(object):
    def __bool__(self):
        return False

    __nonzero__=__bool__

動作する(確認されていない)か、メタクラス:)を自分で作成する必要があります。

2
jhp