Присвойте классу логическое значение в Python - PullRequest
13 голосов
/ 20 марта 2012

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

   if not x:
       print "X is false."

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

Ответы [ 2 ]

22 голосов
/ 20 марта 2012

Вам необходимо реализовать метод __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__ также не был определен, все экземпляры будут считаться истинными.

В Python 3 вместо __nonzero__.

используется __bool__.
7 голосов
/ 20 марта 2012
class Foo:
     def __nonzero__(self): return False
     __bool__ = __nonzero__ # this is for python3

In [254]: if Foo():
   .....:     print 'Yeah'
   .....: else: print 'Nay'
   .....:
Nay

Или, если вы хотите быть ультрапортативным, вы можете определить только __len__, который будет иметь одинаковый эффект на обоих языках, но имеет (потенциальный) недостаток, который подразумевает, что ваш объект имеет значимую меру длины (чего не может).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...