Skip to content

Instantly share code, notes, and snippets.

@Guilouf
Last active February 21, 2018 13:20
Show Gist options
  • Save Guilouf/69ae99d8bd24058ddc57b121df99ba67 to your computer and use it in GitHub Desktop.
Save Guilouf/69ae99d8bd24058ddc57b121df99ba67 to your computer and use it in GitHub Desktop.
class MetaRace(type):
def __new__(mcs, name, bases, dct):
dct['genre'] = 'M' # ecrasé après
dct['espece'] = 'YAGARA' # pas ecrasé
return super().__new__(mcs, name, bases, dct)
class Parent:
nom = "daron"
say = f"je suis {nom}"
nom_de_famille = "dugland"
def inst_meth(self):
return self.nom + " est mon nom"
class MetaSoeur(MetaRace): # hérité pas de type mais d'une autre metaclasse. Faut que ce soit la mm pr toutes
def __new__(mcs, name, bases, dct):
print(dct) # le dico des attributs de la classe enfant..
bases = (Parent,)
dct['say'] = f"je suis {dct['nom']}"
inst = super().__new__(mcs, name, bases, dct)
# on peut modifier ensuite ce que le __new__ hérité de MetaRace
inst.genre = 'multi'
# on surcharge la méthode du parent
inst.inst_meth = lambda self: super(inst, self).inst_meth() + " a moi"
return inst
# autre syntaxe, pour le meme effet
# def __new__(mcs, name, bases, dct):
# class EnfantHerintant(Parent, metaclass=MetaRace): # ici on ignoré le super ds __new__, dc on peut appeler l'autre metaclasse
# nom = dct['nom'] # par contre faut passer manuellement les attrs de l'enfant
# say = f"je suis {nom}"
#
# genre = "multi sans effet" # écrasé par Metarace
#
# def inst_meth(self):
# return super().inst_meth() + " a moi"
#
# EnfantHerintant.genre = "multi"
# return EnfantHerintant
class Enfant(metaclass=MetaSoeur):
nom = "chiard"
print(Enfant.say)
print(Enfant.nom)
print(Enfant.nom_de_famille)
print(Enfant.genre)
print(Enfant.espece)
print(Enfant().inst_meth())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment