Назначить булевое значение класса в Python
Если инструкции в Python позволяют вам сделать что-то вроде:
if not x:
print "X is false."
Это работает, если вы используете пустой список, пустой словарь, None, 0 и т.д., но что, если у вас есть собственный пользовательский класс? Можете ли вы присвоить ложное значение для этого класса, чтобы в том же стиле условного, он вернет false?
Ответы
Ответ 1
Вам необходимо реализовать метод __nonzero__
в вашем классе. Это должно возвращать True или False для определения значения истины:
class MyClass(object):
def __init__(self, val):
self.val = val
def __nonzero__(self):
return self.val != 0 #This is an example, you can use any condition
x = MyClass(0)
if not x:
print 'x is false'
Если __nonzero__
не определено, реализация вызовет __len__
, и экземпляр будет считаться True, если он вернет ненулевое значение. Если __len__
также не определено, все экземпляры будут считаться True.
В Python 3 вместо __nonzero__
используется __bool__
.
Ответ 2
class Foo:
def __nonzero__(self): return False
__bool__ = __nonzero__ # this is for python3
In [254]: if Foo():
.....: print 'Yeah'
.....: else: print 'Nay'
.....:
Nay
Или, если вы хотите быть ультрапортативным, вы можете определить только __len__
, который будет иметь тот же эффект на обоих языках, но имеет (потенциальный) недостаток, что он подразумевает, что ваш объект имеет значимую меру длины (что не может быть).
Это будет работать для любого экземпляра, в зависимости от фактической логики, введенной вами в метод.