2011-11-20 28 views
56

Tại sao điều này không hoạt động như một người có thể có kỳ vọng ngây thơ?Xác định "boolness" của một lớp trong python

class Foo(object): 
    def __init__(self): 
     self.bar = 3 
    def __bool__(self): 
     return self.bar > 10 

foo = Foo() 

if foo: 
    print 'x' 
else: 
    print 'y' 

(Đầu ra là x)

+0

Bản sao chỉ giải quyết vấn đề cho Python 2. Trong khi bản sao này đưa ra giải pháp di động. –

Trả lời

60

Đối với khả năng tương thích Python 2-3, chỉ cần thêm video này vào ví dụ của bạn:

Foo.__nonzero__ = Foo.__bool__ 

hoặc mở rộng định nghĩa ban đầu của Foo bao gồm:

__nonzero__ = __bool__ 

Bạn có thể xác định tất nhiên họ ngược cũng vậy, trong đó tên phương thức là __nonzero__ và bạn gán nó cho __bool__, nhưng tôi nghĩ tên __nonzero__ chỉ là một di sản của C-ishness gốc của việc diễn giải các đối tượng của Python là trung thực hoặc giả dựa trên sự tương đương của chúng với z ero. Chỉ cần thêm câu lệnh ở trên và mã của bạn sẽ hoạt động với Python 2.x và sẽ tự động hoạt động khi bạn nâng cấp lên Python 3.x (và cuối cùng bạn thả nhiệm vụ vào __nonzero__).

+3

Tôi thích từ đó, C-ishness – wim

+2

Tôi là một neologiac. – PaulMcG

+0

và một vòng lặp lạ. –

22

Bởi vì phương pháp đặc biệt tương ứng được gọi là __nonzero__() bằng Python 2, và không __bool__() đến Python 3.

49

Phương pháp __bool__ được sử dụng trong Python 3. Đối với Python 2, bạn muốn __nonzero__.

+0

đúng, lạ nhưng đúng. tốt để xem họ đã thay đổi triển khai thành 'một cách rõ ràng để làm điều đó' – wim

+6

@wim: Không quá lạ. Tên phương thức '__nonzero __()' đáng kể trước khi giới thiệu kiểu 'bool' trong Python. Trước 'bool', chỉ sử dụng các số nguyên' 0' và '1'. –

+1

Vâng, thật ngạc nhiên khi đọc điều đó. Đúng và sai là khái niệm rất khác nhau từ các số nguyên 0 và 1, vì vậy tôi rất vui mừng bool đã được giới thiệu. Tôi vẫn thấy lạ rằng bool là một phân lớp của int, và tôi cringe khi tôi thấy ai đó lập chỉ mục một mảng với bool .. – wim

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