2016-07-14 6 views
0

Ich frage mich, warum die dritte Zeile in Snippet B würde einen Fehler auslösen. Mein Verständnis ist in der zweiten Zeile in Snippet B (und A), ich erstellte eine Klassenvariable (keine Klasseninstanz) cls_obj, deren Typ/Klassenname Duck ist. Es ist wieKann ich in Python ein benanntes Tupel mit typename definieren?

Also erwartete ich Snippet A und B würde beide funktionieren, jedoch Snippet B fehlgeschlagen! Was ist schief gelaufen?

# Snippet A 
from collections import namedtuple 
cls_obj=namedtuple('Duck', 'bill tail') 
duck = cls_obj(bill='wide orange', tail='long') 

# Snippet B 
from collections import namedtuple 
cls_obj=namedtuple('Duck', 'bill tail') 
duck = Duck(bill='wide orange', tail='long') 
+0

Was war der Fehler? –

+0

NameError: Name 'Duck' ist nicht definiert @ BurhanKhalid – Nicholas

+1

'namedtuple()' ist eine gewöhnliche Funktion. Es kann keine Namen im umschließenden Bereich definieren. –

Antwort

1

In Python ist eine Klasse nur eine besondere Art von Wert.

class Duck(object): 
    pass 

# 'Duck' is just a variable, you can change it 
Duck = 3 

x = Duck() # Fails! 

Sie können wie diese Dinge tun:

>>> class Goat(object): 
...  def __repr__(self): 
...   return 'Goat()' 
... 
>>> Cow = Goat 
>>> del Goat 
>>> Goat() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'Goat' is not defined 
>>> Cow() 
Goat() 
>>> Cow.__name__ 
'Goat' 
>>> Cow().__class__ 
<class '__main__.Goat'> 

Nun, Sie verstehen, dass eine Klasse nur ein Wert ist, wird alles beginnen, mehr Sinn zu machen. Das namedtuple('Goat', ...) ist nicht dasselbe wie class Goat. Sie definiert eine Klasse, weist aber den resultierenden Wert (die Klasse selbst) keiner Variablen im globalen Gültigkeitsbereich zu. Funktionen können das nicht, und namedtuple() ist eine gewöhnliche Funktion.

+0

Während Funktionen nicht können, dass andere Konstrukte wie eine Klassendefinition das ** können. – syntonym

+0

@Syntonym: Richtig, weil Klassendefinitionen keine Funktionen sind. –

Verwandte Themen