2017-05-22 4 views
0

Ich versuche, eine Schnittstelle in Python 3.6 zu implementieren (ich weiß, dass sie nicht in Python existieren). Mit dem folgenden minimalen Beispiel:Python-Schnittstelle Asserting Member-Variablen sind definiert

import time 

class ModuleInterface: 
    # How often the module information is updated (int in seconds). 
    interval = None 
    def update(self): 
     raise NotImplementedError 

class HardDisk(ModuleInterface): 
############################################################################### 
    pass # First 
############################################################################### 
#  def update(self):  # Second 
#   time.sleep(self.interval) # Second 
############################################################################### 

hd = HardDisk() 
hd.update() 

Der Code sollte einen NotImplementedError für den ersten Fall ergeben. Im zweiten Fall möchte ich einen ähnlichen Fehler erhalten, aber ich weiß nicht, wie ich das in Python korrekt umsetzen kann. Die Idee einer Schnittstelle besteht darin, einen Fehler zu liefern, wenn etwas nicht definiert ist. Aber Intervall ist definiert, weshalb der zweite Fall einen TypeError ergeben wird. Dies ist jedoch nicht die Art von Fehler, die ich gerne bekommen würde. Es wäre perfekt, für alle Mitglieder des ModuleInterface zu behaupten, dass sie durch die erbende Klasse definiert sein müssen.

+1

Warum versuchen Sie nicht mit ABC-Modul in 'Python' – nanithehaddock

+0

Vielen Dank, das scheint das richtige Modul zu sein. – msg

Antwort

0

Sie suchen nach dem abc module. - exemple (Python 2.7 Sie py3 exemples in the 3.6 doc finden):

import abc 
import time 

class ModuleInterface(object): 
    __metaclass__ = abc.ABCMeta 

    # How often the module information is updated (int in seconds). 
    interval = abc.abstractproperty() 

    @abc.abstractmethod 
    def update(self): 
     """ must be implemented """ 

class WrongHardDisk(ModuleInterface): 
    """ This one doesn't define `interval` 
     so it cannot be instanciated 
    """ 
    def update(self): 
     time.sleep(self.interval) 


class HardDisk(ModuleInterface): 
    interval = 5 
    def update(self): 
     time.sleep(self.interval) 

try: 
    # Will raise a TypeError 
    whd = WrongHardDisk() 
except Exception as e: 
    print type(e), e 

# this one will work as expected 
hd = HardDisk() 
hd.update() 

AFAICT die einzige Änderung, um es mit Python funktioniert 3.6 sollten diese (nicht getestet) zu ersetzen sein:

class ModuleInterface(object): 
    __metaclass__ = abc.ABCMeta 
    # ... 

mit

class ModuleInterface(metaclass=abc.ABCMeta): 
    # ... 
+0

Vielen Dank, Ihr Code weist mich definitiv in die richtige Richtung. Ich versuche immer noch herauszufinden, wie man abc in Python 3.6 benutzt ... Die Sache ist, dass ich den von Ihnen erwähnten TypeError nicht erhalte. Es gibt keinen Fehler bei der Instanziierung der falschen Festplatte. – msg

+0

Der Fehler wird abgefangen und in stdout ausgegeben. Wenn Sie es sehen wollen, versuchen Sie, 'WrongHardDisk' außerhalb eines try/except-Blocks zu installieren. –

+0

wrt/"wie benutze ich abc in Python 3.6." Ich habe meinen Beitrag bearbeitet (Vorbehalt: ungeprüft). –

Verwandte Themen