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

Логическое значение объектов в 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".

4b9b3361

Ответ 1

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

Ответ 2

В Python < 3.0:

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

E.G:

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__.