Булево значение объектов в Python

Как мы знаем, 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",

2 ответа

Решение

Обратитесь к документации по Python для __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()

В Python < 3.0:

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

EG:

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 !"

В Python => 3.0:

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

Другие вопросы по тегам