2010-06-25 5 views
12
sous-classement

J'ai la classe suivante:Python, types immuables

class MySet(set): 

    def __init__(self, arg=None): 
     if isinstance(arg, basestring): 
      arg = arg.split() 
     set.__init__(self, arg) 

Cela fonctionne comme prévu (initialisant l'ensemble avec les mots de la chaîne plutôt que les lettres). Cependant, quand je veux faire la même chose avec la version immuable de jeu, la méthode __init__ semble être ignoré:

class MySet(frozenset): 

    def __init__(self, arg=None): 
     if isinstance(arg, basestring): 
      arg = arg.split() 
     frozenset.__init__(self, arg) 

Puis-je obtenir quelque chose de similaire avec __new__?

+1

Je pense que la raison pour laquelle '__new __ (..)' prend l'initiative en matière sculpter des instances de types immuables, c'est tirer parti de l'immuabilité et réserver une opportunité de renvoyer une instance existante si elle est disponible. (Mais si on ne veut pas cet avantage, alors ils peuvent faire un type immuable sans se tromper avec __new __ (..) '. En particulier,' __new __ (..) 'n'offre pas de contexte particulier. avoir à modifier les champs immuables via 'object .__ setattr __ (..)' ou similaire, que ce soit dans __new __ (..) 'ou' __init _ (..) '.) –

Répondre

12

Oui, vous devez remplacer __new__ méthode spéciale:

class MySet(frozenset): 

    def __new__(cls, *args): 
     if args and isinstance (args[0], basestring): 
      args = (args[0].split(),) + args[1:] 
     return super (MySet, cls).__new__(cls, *args) 

print MySet ('foo bar baz') 

Et la sortie est:

MySet(['baz', 'foo', 'bar']) 
+0

super! peut __init__ être déprécié? – EoghanM

+4

@EoghanM: Non, '__new__' est différent. Fondamentalement, '__new__' crée une recherche * ou * une instance, tandis que' __init__' configure une instance déjà créée. Les principales raisons de surcharger '__new__' sont d'éviter la création d'une nouvelle instance (par exemple, pour rendre' SomeType() 'toujours retourner le même objet singleton), ou de sous-classer certains types immuables, comme' frozenset'. Voir http://docs.python.org/reference/datamodel.html#special-method-names pour plus de détails. – doublep

+0

thx - ma sous-question posée plus clairement ici: http://stackoverflow.com/questions/3131488/ – EoghanM

Questions connexes