2017-03-09 2 views
2

Warum müssen wir den Namen Card für namedtuple wie folgt nennen?Warum benötigt namedtuple in Python einen Namen?

import collections 

Card = collections.namedtuple('Card', ['rank', 'suit']) 

denke ich, eine einfache Card = collections.namedtuple(['rank', 'suit']) kann tatsächlich die gleiche Wirkung Recht geben?

Zum Beispiel kann ich die gleichen Informationen in einem dict wie habe:

card = dict({'rank': 'A', 'suit': 'spade'}) 

Antwort

5

Nein, das nicht die gleiche Wirkung geben.

collections.namedtuple: Gibt einen neuen Tupel Unterklasse namens Typnamen ...

namedtuple gibt eine Unterklasse des Tupels Typs, keine Tupel-Instanz.

Die name Parameter geben die Klassennamen der neuen Unterklasse, wie Sie eine normale Python-Klasse definieren würden und geben ihm einen Namen:

>>> from collections import namedtuple 
>>> namedtuple('Card', ['rank', 'suit'], verbose=True) 
class Card(tuple): 
    'Card(rank, suit)' 

    __slots__ =() 

    _fields = ('rank', 'suit') 

    def __new__(_cls, rank, suit): 
     'Create new instance of Card(rank, suit)' 
     return _tuple.__new__(_cls, (rank, suit)) 
    ... 

Eine schnelle Typprüfung jeden Zweifel löscht:

>>> type(_), issubclass(_, tuple) 
(<class 'type'>, True) 

So haben Sie namedtuple, eine Factory-Funktion, die eine Unterklasse eines Tupels zurückgibt.

+0

Es könnte anonym sein, oder? Ich meine, Sie können das zurückgegebene Objekt erfassen und damit machen, was Sie wollen. Zum Beispiel wird 'a = {}' benötigt, wenn Sie das 'dict' beibehalten müssen. Sonst könnte es sofort Müll gesammelt werden. Mit anderen Worten, dieser Name ist wirklich nicht erforderlich ist, was ich dachte. Aber es hilft, einen zu haben. – Nishant

+1

Wie würden Sie eine anonyme Klasse instanziieren? Beachten Sie, dass 'a = {}' über die Literale eine dict ** -Instanz ** erzeugt, keine dict-Unterklasse. –

+0

Meinst du, namedtuple 'ist eigentlich eine Klasse intern? – Nishant

1

Wenn Sie eine benannte Tupel wie diese

from collections import namedtuple 
Card = namedtuple('Card', ['rank', 'suit']) 

Sie erstellen eine neue Klasse erstellen (die eine Unterklasse von tuple ist)

>>> Card 
<class '__main__.Card'> 

Also für Klarheit ist es schöner, speziell zu nennen die Klasse, da sie ihre eigenen spezifischen Eigenschaften hat (__init__ nimmt zwei Argumente, das erste wird das rank Attribut der Instanz, und das zweite wird sein suit Argument).

Der Autor namedtuple könnte den gleichen Namen für alle diese Klassen verwendet haben, so würde es wie <class 'collections.NamedTuple'> aussehen. Aber wie können Sie dann sagen, welche Ihrer neuen Card Klasse ist und welche Ihrer neuen PokerHands Klasse?

Verwandte Themen