Булево значение объектов в 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__
,