2009-07-06 72 views
27

Như chúng ta đã biết, Python có giá trị boolean cho đối tượng: Nếu một lớp có phương thức __len__, mỗi trường hợp của nó __len__() xảy ra để trả về 0 sẽ được đánh giá là boolean False (ví dụ: danh sách trống).Giá trị Boolean của các đối tượng trong Python

Thực tế, mỗi đối tượng tùy chỉnh trống, có thể lặp lại được đánh giá là False nếu nó xuất hiện trong biểu thức boolean.

Bây giờ giả sử tôi có một lớp học foo với thuộc tính bar. Làm thế nào tôi có thể xác định giá trị chân lý của nó, để nói rằng, nó sẽ được đánh giá là True if bar % 2 == 0False nếu không?

Ví dụ:

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

vậy, a(myfoo) nên in "eggs".

+0

Xem thêm: '__nonzero __()' –

Trả lời

34

Tham khảo tài liệu Python cho __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() 
38

Trong Python < 3.0:

Bạn phải sử dụng __nonzero__ để đạt được những gì bạn muốn. Đó là một phương thức được gọi tự động bởi Python khi đánh giá một đối tượng trong một bối cảnh boolean. Nó phải trả về một boolean sẽ được sử dụng làm giá trị để đánh giá.

ví dụ:

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

Trong Python => 3.0:

Cùng một điều, ngoại trừ phương pháp này đã được đổi tên thành nhiều rõ ràng hơn __bool__.

+4

Liệu '__nonzero__' có hoạt động tốt trong Python> = 3.0 không? – Wolf

+1

@Wolf, không có nó sẽ không. – Hammerite

Các vấn đề liên quan