2012-03-20 7 views
12

przypadku stwierdzenia w Pythonie pozwalają zrobić coś takiego:Przypisywanie klasy wartość logiczną w Pythonie

if not x: 
     print "X is false." 

To działa, jeśli używasz pustą listę, pustego słownika, None, 0, etc, ale co jeśli masz własną niestandardową klasę? Czy możesz przypisać fałszywą wartość dla tej klasy, aby w tym samym stylu warunkowym zwracała wartość false?

Odpowiedz

20

Musisz wdrożyć na swojej klasie metodę __nonzero__. To powinno powrócić Prawda czy fałsz określić wartość logiczną:

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' 

Jeśli __nonzero__ nie zostało zdefiniowane, realizacja wezwie __len__ a instancja będą rozpatrywane Prawda jeśli to zwróciło wartość niezerową. Jeśli __len__ nie został zdefiniowany, wszystkie wystąpienia będą uznawane za prawdziwe.

W języku Python 3, __bool__ jest używane zamiast __nonzero__.

+6

Zauważ, że to '__bool__' w Pythonie 3. – delnan

+0

@delnan: Dzięki, dodałem do mojej odpowiedzi. – interjay

+0

Czy to działa tylko wtedy, gdy mam() na końcu? Miałem nadzieję na metodę, która działałaby bez względu na to, czy element był pustą listą, 0 czy instancją mojego obiektu, która jest fałszywa. Członkowie tej klasy, liczby całkowite, łańcuchy itp. Znajdą się na liście. Potrzebuję sposobu na powszechne sprawdzenie, czy którykolwiek z nich jest fałszywy. – 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 

Albo, jeśli chcesz być ultra-przenośny, można zdefiniować __len__ tylko, co będzie miało taki sam efekt w obu językach, ale że ma (potencjalne) minusem, że oznacza to, że obiekt ma miarodajna miara długości (której nie może).

Będzie to działać dla każdej instancji, w zależności od faktycznej logiki, którą umieścisz w metodzie.

+3

Downvoter: Pokaż się. – Marcin

+1

"to oznacza, że ​​twój obiekt ma znaczącą miarę długości", prawdziwe słowa mądrości o semantykach tutaj. – TaylorMac

Powiązane problemy