Python: Comment puis-je hériter du type de liste intégré?
Je tiens à ajouter quelques attributs à la list
type, j'ai donc écrit ceci:
class MyList(list):
def __new__(cls, *args, **kwargs):
obj = super(MyList, cls).__new__(cls, *args, **kwargs)
obj.append('FirstMen')
return obj
def __init__(self, *args, **kwargs):
self.name = 'Westeros'
def king(self):
print 'IronThrone'
if __name__ == '__main__':
my_list = MyList([1, 2, 3, 4])
print my_list
mais my_list
contient uniquement l'élément 'FirstMen'
. Pourquoi mon __new__
ne fonctionne pas ici? Et comment dois-je hériter d'un type comme list
? Est-il de même pour l'immuable des types comme str
?
source d'informationauteur PJ.Hades
Vous devez vous connecter pour publier un commentaire.
La
list
type généralement de l'initialisation de la liste à l'intérieur de son__init__()
de méthode, c'est la convention pour mutable types. Vous avez seulement besoin de remplacer__new__()
lorsque le sous-typage immuable types. Alors que vous peut remplacer__new__()
lorsque le sous-classement de la liste, il n'y a pas beaucoup d'intérêt à le faire pour votre cas d'utilisation. Il est plus facile de simplement remplacer__init__()
:Notez également que je vous déconseillons l'utilisation de
super()
dans ce cas. Vous voulez appelerlist.__init__()
ici, et pas peut-être autre chose.Tout d'abord, faites-vous cela comme un exercice pour comprendre
__new__
? Si non, il est presque certainement une meilleure façon de faire ce que vous essayez de faire. Pourriez-vous expliquer ce que vous souhaitez réaliser ici?Cela dit, voici ce qui se passe dans votre exemple:
MyList([1,2,3,4])
MyList.__new__(MyList,[1,2,3,4])
list.__new__(MyList,[1,2,3,4])
Cette fonction retourne une nouvelle instance de
MyList
, avec n éléments.list.__new__
ne pas remplir la liste. Il ne laisse que delist.__init__
, qui n'est jamais appelée.__new__
méthode ajoute'FirstMen'
videMyList
instance.__new__
méthode retourne l'instance deMyList
.MyList.__init__([1,2,3,4])
est invoquée.name
attribut'Westeros'
.my_list
et imprimés.Voir ici pour une explication de
__new__
: http://docs.python.org/reference/datamodel.html#basic-customization