Sto provando ad usare un po 'di ereditarietà in un programma Python su cui sto lavorando. Ho una classe base, User, che implementa tutte le funzionalità di un utente. Sto aggiungendo il concetto di un utente non approvato, che è proprio come un utente, con l'aggiunta di un singolo metodo.Come si trasmette un'istanza a una classe derivata?
La classe Utente ha alcuni metodi che restituiscono un oggetto Utente. Questo non funzionerà quando sottoclassi, poiché finirò per avere un utente non approvato che restituisce un utente, impedendomi di chiamare questo metodo, tra le altre cose.
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)
I get()
e _from_ldap()
metodi sono gli stessi per entrambe le classi, se il metodo get()
in UnapprovedUser deve restituire un oggetto UnapprovedUser, non un utente.
Come è possibile trasmettere una delle istanze di Utente che ottengo da User.get()
in una UnpprovedUser?
voglio fare qualcosa di simile:
class UnapprovedUser(User):
# continued from before
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return (UnapprovedUser) user # invalid syntax
in modo che possa avvolgere il metodo dal genitore e semplicemente il cast del valore restituito alla classe corretta. Poi di nuovo, facendo in questo modo potrebbe portare il genitore a utilizzare il loro valore per self.base_dn
, che potrebbe rompere tutto.
Esattamente quello che stavo cercando. Grazie. Immagino di non aver mai notato che potresti farlo con il parametro cls in un metodo di classe. –