Вопрос по python – Булево значение объектов в Python

29

Как мы знаем, Python имеет логические значения для объектов: если класс имеет__len__ метод, каждый экземпляр которого для которого__len__() случится возврат 0 будет оцениваться как логическое значениеFalse (например, пустой список).

Фактически, каждый повторяемый пустой пользовательский объект оценивается какFalse если он появляется в логическом выражении.

Теперь предположим, что у меня есть классfoo с атрибутомbar, Как я могу определить его истинное значение, так что, скажем, оно будет оценено какTrue if bar % 2 == 0 а такжеFalse иначе?

Например:

myfoo = foo()
myfoo.bar = 3
def a(myfoo):
    if foo:
        print "spam"
    else:
        print "eggs"

так,a(myfoo) должен напечатать"eggs".

Смотрите также:__nonzero__() Jonathan

Ваш Ответ

2   ответа
41

In Python < 3.0 :

Вы должны использовать__nonzero__ добиться того, что вы хотите. Это метод, который автоматически вызывается Python при оценке объекта в логическом контексте. Он должен возвращать логическое значение, которое будет использоваться в качестве значения для оценки.

Е.Г .:

class Foo(object):

    def __init__(self, bar) :
        self.bar = bar

    def __nonzero__(self) :
        return self.bar % 2 == 0

if __name__ == "__main__":
     if (Foo(2)) : print "yess !"

In Python => 3.0 :

То же самое, за исключением того, что метод был переименован в гораздо более очевидный__bool__.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded__nonzero__Error: User Rate Limit Exceeded
36

__nonzero__.

class foo(object):
    def __nonzero__( self) :
        return self.bar % 2 == 0

def a(foo):
    if foo:
        print "spam"
    else:
        print "eggs"

def main():
    myfoo = foo()
    myfoo.bar = 3
    a(myfoo)

if __name__ == "__main__":
    main()

Похожие вопросы