from time import time

class data(object):

    def get_data(self):
        return self._download_data()

    def _download_data(self):
        """ download data code """
        print("data downloaded")
        return time()

class A(data):

    def __init__(self):
        self.data = self.get_data()
        print(self.data)

class B(data):

    def __init__(self):
        self.data = self.get_data()
        print(self.data)

if __name__ == "__main__":
    a = A()
    b = B()

Ergebnis:

data downloaded
1523989483.9526002
data downloaded
1523989483.9536002

Sie können sehen, dass die Zeit unterschiedlich ist, was bedeutet, dass die Daten nicht gleich sind, da es sich bei den Daten um Zeitreihendaten handelt.

Wie können Fehler behoben werden, um dieselben Daten zu erhalten?

Ich wusste auch, dass die folgende Lösung möglich ist, aber überhaupt nicht:

class B(A):

    def __init__(self):
        self.data = self.get_data()
        print(self.data)

Nehmen wir an, ich habe Klasse C, D, E ... es ist keine gute Idee, Klasse C (B), Klasse D (C), Klasse E (D) zu verwenden ...

0
onon99buynoodle 17 Apr. 2018 im 21:43

3 Antworten

Beste Antwort

Der Grund, warum Sie jedes Mal, wenn Ihr Aufruf get_data keine Daten enthält, unterschiedliche Daten erhalten, liegt darin, dass _download_data die Daten nicht speichert, sondern zurückgibt und wegwirft.

Was Sie brauchen, ist die Klasse Data, um eine Klassenmethode zu haben, die die Daten herunterlädt und speichert. Auf diese Weise werden die Daten in der Klasse gespeichert und sind daher für jede Instanz gleich.

from time import time

class Data:
    data = None

    @classmethod
    def download_data(cls):
        cls.data = time()
        print('Downloaded:', cls.data)

class A(Data):
    def get_data(self):
        print('A:', self.data)

class B(Data):
    def get_data(self):
        print('B:', self.data)

if __name__ == "__main__":
    a = A()
    b = B()

    a.get_data() # prints: None
    b.get_data() # prints: None

    Data.download_data() # prints: Downloaded: 1523995119.6320755

    a.get_data() # prints: A: 1523995119.6320755
    b.get_data() # prints: B: 1523995119.6320755
0
Olivier Melançon 17 Apr. 2018 im 20:05

Vererbung bedeutet nicht, dieselben Daten zu haben! Wenn Sie die Klassen A und B von data ableiten, bedeutet dies nur, dass A und B alle Attribute und Methoden von data haben können. , aber es behält nicht den gleichen Inhalt . Möglicherweise können Sie data als Attribut in A und B verwenden:

from time import time

class data(object):

    def get_data(self):
        return self._download_data()

    def _download_data(self):
        """ download data code """
        print("data downloaded")
        return time()

class A:

    def __init__(self, d):
        self.data = d.get_data()
        print(self.data)

class B:

    def __init__(self, d):
        self.data = d.get_data()
        print(self.data)

if __name__ == "__main__":
    D = data()
    a = A(D)
    b = B(D)
-1
Sadjad Anzabi Zadeh 17 Apr. 2018 im 19:08

Wie Sadjad Anzabi Zadeh betonte, werden bei der Vererbung keine Daten gemeinsam genutzt, es sei denn, Sie codieren sie dazu.

Bitte denken Sie daran, dass dies mein erster Beitrag unter dem Python-Tag ist.

Sie möchten die Daten (Zeit) einmal einstellen und sie dann abrufen, wann immer Sie sie benötigen.

from time import time

class data(object):

    def __init__(self):
        """ Call time() once and store it in self.data """
        self.data = self._download_data()

    def get_data(self):
        """ Just return the property without looking at time() again """
        return self.data

    def _download_data(self):
        return time()

class A:

    def __init__(self, d):
        """ Use d.data property """
        self.data = d.get_data()
        print(self.data)

class B:

    def __init__(self, d):
        """ Use d.data property """
        self.data = d.get_data()
        print(self.data)

if __name__ == "__main__":
    D = data()
    """ pass D to other classes and use its data property directly."""
    a = A(D)
    b = B(D)
0
waterloomatt 17 Apr. 2018 im 19:35