Évitez d'implémenter des fonctions inutiles avec l'héritage

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

Évitez d'implémenter des fonctions inutiles avec l'héritage
Curry n'importe quelle fonction avec Python ...
Introduction aux fonctions Python
Traitement parallèle avec des fonctions locales
Essayez d'implémenter RBM avec chainer.
Essayez d'implémenter XOR avec PyTorch
Essayez d'implémenter le parfum avec Go
Héritage de classe et super fonction
Implémentation de la régression logistique avec NumPy