2017-05-22 9 views
0

私はPython 3.6でインターフェイスを実装しようとしています(Pythonには存在しません)。次の最小限の例を使用します。Pythonインターフェイスのメンバー変数が定義されています

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() 

コードは、最初のケースでNotImplementedErrorを生成する必要があります。後者の場合、私は似たようなエラーを出したいと思いますが、これをPythonで正しく実装する方法はわかりません。インターフェースの考え方は、何かが定義されていないとエラーを出すことです。しかし、間隔が定義されているため、2番目のケースではTypeErrorが返されます。しかし、これは私が得たいと思う種類のエラーではありません。 ModuleInterfaceのすべてのメンバーが継承するクラスによって定義されなければならないことを宣言することは完璧です。

+1

なぜあなたは 'python'でABCモジュールを試してみませんか? – nanithehaddock

+0

ありがとう、それは正しいモジュールのようです。 – msg

答えて

0

あなたはabc moduleを探しています。この(未テスト)を交換することであるべきことは、Python 3.6で動作させるためにのみ変更AFAICT

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() 

:: - Exemple(Pythonの2.7あなたがPY3のthe 3.6 docでexemplesを見つけることができます)

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

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

ありがとう、あなたのコードは間違いなく正しい方向に私を指します。私はまだPython 3.6でabcを使う方法を見つけようとしています...あなたが言及したTypeErrorを得ることはできません。間違ったハードディスクをインスタンス化するときにエラーはありません。 – msg

+0

エラーはキャッチされ、stdoutに出力されます。見たい場合はtry/exceptブロックの外側で 'WrongHardDisk'をインスタンス化してみてください。 –

+0

wrt/"Python 3.6でabcを使用する方法"私は自分の投稿を編集した(警告:未テスト)。 –

関連する問題