2016-11-21 7 views
1

Ich habe eine Klasse unten angegeben. Es implementiert __iter__ und __next__. Es ist ein iterabler und ein eigener Iterator.Überprüfen, ob eine Klasse iterierbar ist

class fib(object): 
    def __init__(self): 
     self.prev = 0 
     self.curr = 1 

    def __iter__(self): 
     return self 

    def __next__(self): 
     value = self.curr 
     self.curr += self.prev 
     self.prev = value 
     return value 


from collections import Iterable 

print(isinstance(fib, Iterable)) 

Der Druck Anweisung gibt False, würde ich erwarten, dass es True

+1

'fib' ist die * Klasse *, keine Instanz. Sie würden also den Unterklassencheck 'issubclass (fib, Iterable)' verwenden. Oder du erschaffst zuerst eine Instanz: 'isinstance (fib(), Iterable)' - Das bekommst du, wenn du deinen Klassennamen mit einem Kleinbuchstaben beginnst;) – poke

+0

'fib' ist nicht iterierbar. 'fib' ist eine Klasse, deren Instanzen iterierbar sind. Der Versuch, über "fib" selbst zu iterieren, wäre wie der Versuch, das Konzept von Burgern zu essen. – user2357112

Antwort

4

Überprüfung zurück, wenn ein Objekt iterable korrekt ist, wie du getan hast, durchgeführt mit:

isinstance(obj, collections.Iterable) 

Der Problem hier ist, liefern Sie eine class zu isinstance und keine Instanz. Es ist False weil isinstance voran gehen und überprüfen, ob type(fib) eine __iter__ Methode hat definiert:

type(fib).__iter__ # AttributeError 

Dies ist natürlich nicht der Fall. type(fib) ist type, die keine __iter__ Methode definiert.

Wenn Sie eine Instanz, um es liefern, druckt es richtig True:

isinstance(fib(), Iterable) # True 

weil in type(fib()) suchen sie fib.__iter__ finden.

Alternativ Fütterung fib-issubclass führt eine ähnliche Prüfung, dass stattdessen eine Klasse als erstes Argument:

issubclass(fib, Iterable) # True 

Zwei zusätzliche kleinere Dinge hinweisen:

  • Mit object als eine explizite Basisklasse ist in Python 3 unnötig (wenn Sie jedoch Code entwickeln, der sowohl auf Py2 als auch auf Py3 läuft, ist das eine gute Sache.)
  • Laut PEP 8 sollten Klassennamen der CapWords-Konvention folgen, daher sollte fib idealerweise Fib heißen.
Verwandte Themen