Comment avez-vous jeté une instance d'une classe dérivée?

Je suis en train d'utiliser un peu de l'héritage dans un programme en Python, je travaille sur. J'ai une classe de base, Utilisateur, qui implémente toutes les fonctionnalités d'un utilisateur. Je suis l'ajout de la notion de non approuvés de l'utilisateur, ce qui est juste comme un utilisateur, avec l'ajout d'une méthode unique.

L'Utilisateur de la classe a certaines méthodes qui retournent un objet Utilisateur. Cela ne fonctionne pas quand je sous-classe, car je vais finir par avoir un UnapprovedUser retour d'un Utilisateur, m'empêchant de l'appel de cette méthode, parmi d'autres choses.

class User(object):
    base_dn = 'ou=Users,dc=example,dc=org'

    @classmethod
    def get(cls, uid):
        ldap_data = LdapUtil.get(uid + ',' + self.base_dn)
        return User._from_ldap(ldap_data)

class UnapprovedUser(User):
    base_dn = 'ou=UnapprovedUsers,dc=example,dc=org'

    def approve(self):
        new_dn = '' # the new DN
        LdapUtil.move(self.dn, new_dn)

La get() et _from_ldap() méthodes sont les mêmes pour les deux catégories, bien que la get() méthode dans UnapprovedUser doit retourner un UnapprovedUser objet, et non un Utilisateur.

Comment puis-je cast une des instances de l'Utilisateur que je reçois de User.get() dans un UnapprovedUser?

Je veux faire quelque chose comme:

class UnapprovedUser(User):
    # continued from before

    @classmethod
    def get(cls, uid):
        user = super(UnapprovedUser, cls).get(uid)
        return (UnapprovedUser) user # invalid syntax

afin que je puisse envelopper la méthode du parent et tout simplement jeté la valeur renvoyée à la classe correcte. Puis à nouveau, faire de cette façon pourrait conduire à la mère à l'aide de leur valeur pour self.base_dn, qui allait tout casser.

OriginalL'auteur Chris Lieb | 2009-07-13