Post précédent Réorganiser new et init alors
class SheetData():
def __init__(self, shtnam, toprow, keyclm, lftclm, rgtclm):
self.data = get_sheet_data(shtnam, toprow, keyclm, lftclm, rgtclm)
self.clmcnt = rgtclm - lftclm + 1
def getRecordCount(self):
return len(self.data) / self.clmcnt
def get(self, rowidx, clmidx):
return self.data[rowidx * self.clmcnt + clmidx]
class CategoryStructure(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "__instance__"):
cls.__instance__ = super(CategoryStructure, cls).__new__(cls, *args, **kwargs)
cls._data = SheetData(u"Structure de catégorie", 3, 2, 2, 5)
return cls.__instance__
def getRecordCount(self):
return self._data.getRecordCount()
def get(self, rowidx, clmidx):
return self._data.get(rowidx, clmidx)
J'ai écrit comme ça, mais je n'aime pas les fonctions getRecordCount () et get () implémentées dans SheetData implémentées dans CategoryStructure, j'ai donc essayé de savoir si cela pouvait être géré par héritage (héritage multiple).
Je me suis référé au site suivant.
La source d'héritage init () doit être explicitement appelée. Dans le cas d'héritage multiple dans le site écrit ci-dessus, lors de la spécification d'un argument (argument autre que self) dans init (), il est nécessaire de spécifier explicitement la classe source de l'héritage, donc implémentez-la comme telle. (Pour être prudent, si je l'ai implémenté sans spécifier le nom de la classe, cela n'a pas fonctionné comme prévu (SheetData init n'a pas été appelé))
Le seul changement est la classe CategoryStructure.
class CategoryStructure(object, SheetData):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "__instance__"):
cls.__instance__ = super(CategoryStructure, cls).__new__(cls, *args, **kwargs)
return cls.__instance__
def __init__(self, *args, **kwargs):
#Bien que self soit un objet d'instance, il est implémenté comme une seule tonne, donc le jugement suivant est
#Fonctionne bien
if not hasattr(self, "data"):
#super(CategoryStructure, self).__init__(self, u"Structure de catégorie", 3, 2, 2, 5)
#ce qui précède(commentaire)Puis SheetData.__init__()Ne marche pas
#Spécifiez explicitement le nom de la classe__init__()Appel
SheetData.__init__(self, u"Structure de catégorie", 3, 2, 2, 5)
Je tâtonne encore, mais pour le moment, c'était rafraîchissant.
Recommended Posts