2010-02-10 10 views
39

Wszystko, czego chcę, to bool (myInstance), aby zwrócić False (i dla myInstance ocenić Fałsz, gdy w trybie warunkowym, jak gdyby/lub/i. Wiem, jak zastąpić>, <, =)nadpisywanie bool() dla niestandardowej klasy

próbowałem to:

class test: 
    def __bool__(self): 
     return False 

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

Wszelkie sugestie?

(używam Python 2.6)

Odpowiedz

56

Czy to Python 2.x lub Python 3.x? W przypadku Pythona 2.x zamiast tego chcesz zastąpić __nonzero__.

class test: 
    def __nonzero__(self): 
     return False 
+1

Dzięki za to ... Szukałem sposobu na przetestowanie metody klasy '__nonzero__' dla [testowania' Fałszywy' tutaj] (https://github.com/trinitronx/python_koans/commit/2fe356926fef8e615b06fe7aaaa9a844536e58b5) – TrinitronX

49

Jeżeli chcesz zachować swój kod do przodu kompatybilny z python3 można zrobić coś takiego

class test: 
    def __bool__(self): 
     return False 
    __nonzero__=__bool__ 
7

jeśli test jest lista, jak zdefiniować len i bool (myInstanceOfTest) zwróci true/Fałsz, jeśli istnieje 1 lub 0 elementów. To działało dla mnie.

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 
+1

To jest przydatne. Dzięki za to alternatywne rozwiązanie. – Ponkadoodle

1

podobne do Johna La Rooy, używam:

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

    def __nonzero__(self): 
     return self.__bool__() 
1

[to jest komentarz na odpowiedź od @ john-la-Rooy, ale nie mogę się wypowiedzieć jeszcze :)]

dla kompatybilności Python3 można zrobić (szukałem tego)

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

    __nonzero__=__bool__ 

jedynym problemem jest to, że trzeba powtórzyć __nonzero__ = __bool__ za każdym razem, gdy zmieniasz __bool__ w podklasach. W przeciwnym razie __nonzero__ będzie trzymany z nadklasy. Możesz wypróbować:

from builtins import object # needs to be installed ! 

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

    __nonzero__=__bool__ 

który powinien działać (nie potwierdzony) lub napisać metaclass :) samemu.

+0

Lub użyj podejścia z tknickman, aby uniknąć tego problemu. Dodaje jednak kolejne wywołanie funkcji! – jhp

Powiązane problemy