2014-04-25 3 views
0

J'ai une classe A faite par quelqu'un d'autre, que je ne peux pas modifier:Python remplaçant setter à un attribut sans setter?

class A: 
    def __init__(self, x): 
     self.x = x 

Maintenant, je suis en train d'hériter ma propre classe B de A, et ont x comme une propriété au lieu d'un attribut. Est-ce possible?

J'ai déjà essayé:

class B(A): 
    def __init__(self, x): 
     super().__init__(x) 

    @property 
    def x(self): 
     return super().x 

    @x.setter 
    def x(self, x): 
     super().x = x 
     print(x) # my stuff goes here 

Mais comme je m'y attendais, il est impossible: AttributeError: 'super' object has no attribute 'x'

est-il une autre méthode, certains workaroud peut-être?

Répondre

1

Non, vous ne pouvez pas utiliser super() pour autre chose que des attributs de classe; x est un attribut de d'instance et il n'existe aucun mécanisme d'héritage pour les attributs.

Les attributs d'instance résident dans un espace de nom unique; il n'y a pas d'espace de noms d'attribut 'instance parent'.

Vous pouvez encore atteindre l'attribut dans l'instance __dict__ objet:

class B(A): 
    @property 
    def x(self): 
     return self.__dict__['x'] 

    @x.setter 
    def x(self, x): 
     self.__dict__['x'] = x 
     print(x) # my stuff goes here 

Une propriété est un descripteur de données , ce qui signifie qu'il est recherché avant les attributs d'instance sont consultés (voir le descriptor howto), mais vous pouvez toujours y accéder directement.

+0

Merci pour la réponse, je vais accepter dès que possible. :) Peut-être un peu "hacky" façon (bien, au moins, semble un peu hacky pour accéder à '__dict__'), mais semble fonctionner tout simplement génial –