[PYTHON] Vermeiden Sie die Implementierung nutzloser Funktionen mit Vererbung

Vorherigen Post Reorganisieren Sie new und init damit

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"Kategoriestruktur", 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)

Ich habe so geschrieben, aber ich mag die Funktionen getRecordCount () und get () nicht, die in SheetData implementiert sind, die in CategoryStructure implementiert sind. Deshalb habe ich versucht herauszufinden, ob sie durch Vererbung (Mehrfachvererbung) verwaltet werden können.

Ich habe auf die folgende Seite verwiesen.

Die Vererbungsquelle init () muss explizit aufgerufen werden. Bei Mehrfachvererbung auf der oben beschriebenen Site muss beim Angeben eines Arguments (eines anderen Arguments als self) in init () die Vererbungsquellklasse explizit angegeben werden. Implementieren Sie sie daher als solche. (Um auf der sicheren Seite zu sein, wenn ich es ohne Angabe des Klassennamens implementiert habe, hat es nicht wie erwartet funktioniert (SheetData init wurde nicht aufgerufen))

Die einzige Änderung ist die CategoryStructure-Klasse.

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):
		#Obwohl self ein Instanzobjekt ist, wird es als einzelne Tonne implementiert, daher lautet das folgende Urteil
		#Funktioniert gut
		if not hasattr(self, "data"):
			#super(CategoryStructure, self).__init__(self, u"Kategoriestruktur", 3, 2, 2, 5)
			#obenstehendes(Kommentar)Dann SheetData.__init__()Funktioniert nicht
			#Geben Sie den Klassennamen explizit an__init__()Anruf
			SheetData.__init__(self, u"Kategoriestruktur", 3, 2, 2, 5)

Ich tappe immer noch, aber vorerst war es erfrischend.

Recommended Posts

Vermeiden Sie die Implementierung nutzloser Funktionen mit Vererbung
Curry jede Funktion mit Python ....
Einführung in Python-Funktionen
Parallelverarbeitung mit lokalen Funktionen
Versuchen Sie, RBM mit Chainer zu implementieren.
Versuchen Sie, XOR mit PyTorch zu implementieren
Versuchen Sie, Parfüm mit Go zu implementieren
Klassenvererbung und Superfunktion
Implementierung der logistischen Regression mit NumPy