2012-03-20 69 views
12

Nếu báo cáo bằng Python cho phép bạn làm điều gì đó như:lớp Gán giá trị boolean bằng Python

if not x: 
     print "X is false." 

này hoạt động nếu bạn đang sử dụng một danh sách rỗng, một từ điển rỗng, Không, 0, vv, nhưng những gì nếu bạn có lớp tùy chỉnh của riêng bạn? Bạn có thể gán một giá trị sai cho lớp đó sao cho trong cùng một kiểu điều kiện, nó sẽ trả về false?

Trả lời

20

Bạn cần triển khai phương thức __nonzero__ trên lớp học của mình. Này sẽ trả về True hoặc False để xác định giá trị thật:

class MyClass(object): 
    def __init__(self, val): 
     self.val = val 
    def __nonzero__(self): 
     return self.val != 0 #This is an example, you can use any condition 

x = MyClass(0) 
if not x: 
    print 'x is false' 

Nếu __nonzero__ chưa được xác định, việc thực hiện sẽ gọi __len__ và các trường hợp sẽ được xem xét True nếu nó trở lại một giá trị khác. Nếu __len__ chưa được xác định, tất cả các phiên bản sẽ được coi là True.

Trong Python 3, __bool__ được sử dụng thay vì __nonzero__.

+6

Lưu ý rằng đó là '__bool__' bằng Python 3. – delnan

+0

@delnan: Cảm ơn, đã thêm vào câu trả lời của tôi. – interjay

+0

Điều này chỉ hoạt động nếu tôi có() vào cuối nó? Tôi đã hy vọng cho một phương pháp mà sẽ làm việc cho dù mục là một danh sách sản phẩm nào, một 0, hoặc một thể hiện của đối tượng của tôi đó là sai. Các thành viên của lớp này, số nguyên, chuỗi, v.v., tất cả sẽ nằm trong danh sách. Tôi cần một cách để kiểm tra toàn cầu nếu có bất kỳ sai lầm nào. – Kelketek

7
class Foo: 
    def __nonzero__(self): return False 
    __bool__ = __nonzero__ # this is for python3 

In [254]: if Foo(): 
    .....:  print 'Yeah' 
    .....: else: print 'Nay' 
    .....: 
Nay 

Hoặc, nếu bạn muốn trở thành siêu di động, bạn có thể xác định __len__ chỉ, sẽ có tác dụng tương tự trong cả hai ngôn ngữ, nhưng điều đó có (tiềm năng) nhược điểm mà nó ngụ ý rằng đối tượng của bạn có một thước đo có ý nghĩa về chiều dài (mà nó có thể không).

Điều này sẽ hoạt động đối với bất kỳ trường hợp nào, tùy thuộc vào logic thực tế bạn đặt trong phương thức.

+3

Downvoter: Thể hiện bản thân. – Marcin

+1

"nó ngụ ý rằng đối tượng của bạn có một thước đo có ý nghĩa về chiều dài", những lời chân thật của sự khôn ngoan về ngữ nghĩa ở đây. – TaylorMac

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