J'implémente un objet qui est presque identique à un ensemble, mais qui nécessite une variable d'instance supplémentaire, donc je sous-classe l'objet set intégré. Quelle est la meilleure façon de s'assurer que la valeur de cette variable est copiée quand l'un de mes objets est copié?Quelle est la manière correcte (ou la meilleure) de sous-classer la classe d'ensemble Python, en ajoutant une nouvelle variable d'instance?
En utilisant le module vieux ensembles, le code suivant a parfaitement fonctionné:
import sets
class Fooset(sets.Set):
def __init__(self, s = []):
sets.Set.__init__(self, s)
if isinstance(s, Fooset):
self.foo = s.foo
else:
self.foo = 'default'
f = Fooset([1,2,4])
f.foo = 'bar'
assert((f | f).foo == 'bar')
mais cela ne fonctionne pas à l'aide du module intégré dans le jeu.
La seule solution que je peux voir est de surcharger chaque méthode qui retourne un objet set copié ... dans ce cas, je pourrais aussi bien ne pas déranger l'objet set. Sûrement il y a une manière standard de faire ceci?
(Pour clarifier, le code suivant ne pas travail (l'assertion échoue):
class Fooset(set):
def __init__(self, s = []):
set.__init__(self, s)
if isinstance(s, Fooset):
self.foo = s.foo
else:
self.foo = 'default'
f = Fooset([1,2,4])
f.foo = 'bar'
assert((f | f).foo == 'bar')
)
c'est une contribution utile, merci. il ne semble pas que vous gagniez beaucoup en faisant de _wrap_methods une méthode de classe plutôt qu'une fonction - est-ce uniquement pour la modularité qu'il donne? – rog
C'est vraiment cool, merci pour la contribution perspicace! – bjd2385