Подтвердить что ты не робот

Назначить булевое значение класса в Python

Если инструкции в Python позволяют вам сделать что-то вроде:

   if not x:
       print "X is false."

Это работает, если вы используете пустой список, пустой словарь, None, 0 и т.д., но что, если у вас есть собственный пользовательский класс? Можете ли вы присвоить ложное значение для этого класса, чтобы в том же стиле условного, он вернет false?

4b9b3361

Ответ 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__, который будет иметь тот же эффект на обоих языках, но имеет (потенциальный) недостаток, что он подразумевает, что ваш объект имеет значимую меру длины (что не может быть).

Это будет работать для любого экземпляра, в зависимости от фактической логики, введенной вами в метод.