2011-11-20 10 views
56

Neden bu, bir kişinin beklenmedik bir şekilde beklediği gibi çalışmıyor?Python'da bir sınıfın "boolness" i tanımlanması

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' 

karşılık gelen özel bir yöntem Python 2 __nonzero__() denir çünkü

+0

Yinelenen yalnızca Python 2 için olan sorunu ele alır. Bu kişi taşınabilir bir çözüm sağlarken. –

cevap

60

Python 2-3 uyumluluk için, sadece örnek için bu eklemek

__nonzero__ = __bool__ 

Elbette tersi şekilde tanımlayabiliriz Ayrıca, yöntem adı __nonzero__ olduğu ve __bool__ olarak atandığınız, ancak __nonzero__ adının, Python'un nesneler hakkındaki yorumlarının orijinal C-ishnessinin bir mirası olduğunu düşünüyorum. ero. Sadece yukarıdaki ifadeyi ekleyin ve kodunuz Python 2.x ile çalışacaktır ve Python 3.x'e yükselttiğinizde otomatik olarak çalışacaktır (ve sonunda atamayı __nonzero__'a bırakın).

+3

Bu kelimeyi seviyorum C-ishness – wim

+2

Ben bir neologiac'ım. – PaulMcG

+0

ve garip bir döngü. –

49

kadar __bool__ yöntem için Python 3'te kullanılan Python 2, __nonzero__'u istiyorsun. içerecek şekilde Foo özgün tanımı

Foo.__nonzero__ = Foo.__bool__ 

veya genişletmek:

+0

doğru, garip ama doğru. Uygulamayı değiştirmek için 'bariz bir şekilde' değiştirdiler. – wim

+6

@wim: Çok garip değil. __nonzero __() 'yöntem adı, Python'da" boole "türünün kullanılmasını önemli ölçüde önler. 'Bool' önce, sadece '0' ve '1' tam sayılarını kullanın. –

+1

Evet, bunu okumak oldukça sürpriz oldu. Doğru ve Yanlış kavramsal olarak 0 ve 1 tam sayılarından çok farklıdır, bu yüzden bool'un kullanılmasına çok sevindim. Ben hala bool int bir alt sınıfı olduğunu ve bir bool ile bir dizi indeksi bir dizi gördüğümde ben saçma sapan .. – wim