sovrascrivendo bool () per la classe personalizzata [duplicare]
-
19-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- Definire “boolness” di una classe in Python 3 risposte
Tutto quello che voglio è per bool (myInstance) per restituire False (e per myInstance valutare False quando in una condizione come se / o / e. So come ignorare>, <, =)
Ho provato questo:
class test:
def __bool__(self):
return False
myInst = test()
print bool(myInst) #prints "True"
print myInst.__bool__() #prints "False"
Qualche suggerimento?
(sto usando Python 2.6)
Soluzione
E 'questo 2.x Python o Python 3.x? Per Python 2.x si sta cercando di ignorare __nonzero__
invece.
class test:
def __nonzero__(self):
return False
Altri suggerimenti
Se si desidera mantenere il vostro codice in avanti compatibile con python3 si potrebbe fare qualcosa di simile
class test:
def __bool__(self):
return False
__nonzero__=__bool__
Se la classe è test
lista simile, definire __len__
e bool(myInstanceOfTest)
tornerà True
se ci sono elementi 1+ (lista non vuota) e False
se ci sono 0 prodotti (elenco vuoto). Questo ha funzionato per me.
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
Simile a John La Rooy, io uso:
class Test(object):
def __bool__(self):
return False
def __nonzero__(self):
return self.__bool__()
[Questo è un commento alla risposta da @ john-la-Rooy, ma non posso commentare ancora :)]
Per python3 compatibilità si può fare (ero alla ricerca di questo)
class test(object):
def __bool__(self):
return False
__nonzero__=__bool__
unico problema è che è necessario ripetere l'everytime __nonzero__ = __bool__
si cambia __bool__
nelle sottoclassi. In caso contrario __nonzero__
sarà tenuto dalla superclasse. Si può provare
from builtins import object # needs to be installed !
class test(object):
def __bool__(self):
return False
__nonzero__=__bool__
che dovrebbe funzionare (non confermata) o scrivere una metaclasse :) te stesso.