Comment modifier dynamiquement la classe de base de cas au moment de l'exécution?

Cet article a un extrait montrant l'utilisation de __bases__ pour modifier dynamiquement la hiérarchie d'héritage de code Python, par l'ajout d'une classe à une des classes existantes collection de classes dont il hérite. Ok, c'est dur à lire, le code est probablement le plus clair:

class Friendly:
    def hello(self):
        print 'Hello'

class Person: pass

p = Person()
Person.__bases__ = (Friendly,)
p.hello()  # prints "Hello"

Qui est, Person n'héritent pas de Friendly au niveau de la source, mais plutôt cette relation d'héritage est ajouté dynamiquement à l'exécution, par la modification de la __bases__attribut de la classe Personne. Toutefois, si vous modifiez Friendly et Person à de nouvelles classes de style (par hérite de l'objet), vous obtenez l'erreur suivante:

TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'

Un peu de Googling sur ce qui semble indiquer certaines incompatibilités entre un style nouveau et vieux style de classes en ce qui concerne la modification de la hiérarchie d'héritage au moment de l'exécution. Plus précisément: "Nouveau style des objets de la classe ne prennent pas en charge l'affectation à leur les bases l'attribut".

Ma question, est-il possible de faire de la ci-dessus Amicale/Personne exemple de travail à l'aide de nouvelles classes en Python 2.7+, éventuellement par l'utilisation de la __mro__ attribut?

Avertissement: j'ai pleinement conscience que ce n'est pas le code. J'ai pleinement conscience que la production réelle du code des astuces comme cette tendance à la frontière de illisible, c'est une pure expérience de pensée, et pour funzies d'apprendre quelque chose sur la façon Python traite de questions relatives à l'héritage multiple.

  • Il est également agréable pour les apprenants de lire ceci si ils ne sont pas familiers avec la métaclasse, type(), ...: slideshare.net/gwiener/metaclasses-in-python 🙂
  • Voici mon cas d'utilisation. Je suis de l'importation d'une bibliothèque qui a de la classe B hérite de la classe A.
  • Voici mon cas d'utilisation. Je suis de l'importation d'une bibliothèque qui a de la classe B hérite de la classe A. je veux créer New_A héritant de A, avec new_A_method(). Maintenant, je veux créer New_B héritant de... eh bien, de B, si B hérité de New_A, de sorte que le B de méthodes, les méthodes, et new_A_method() sont tous disponibles à des instances de New_B. Comment puis-je le faire sans singe-correctifs existants de la classe A?
  • Ne pourriez-vous pas avoir New_B hériter de deux B et New_A? Rappelez-vous Python supporte l'héritage multiple.
  • Après un peu de googling, le python suivant rapport de bug nous a semblé pertinent... bugs.python.org/issue672115
InformationsquelleAutor Adam Parkin | 2012-03-02