2016-08-09 8 views
0

私は、ABCを継承するクラスのメソッドが適切なデコレータを使用して作成されるようにする方法を理解しようとしています。私は(うまくいけば)ABCがどのように一般的に働くかを理解している。ABCはメソッドデコレータを強制しますか?

from abc import ABCMeta, abstractmethod 

class MyABC(metaclass=ABCMeta): 
    @abstractmethod 
    def my_abstract_method(self): 
     pass 

class MyClass(MyABC): 
    pass 

MyClass() 

これは、 "TypeError例外を:my_abstract_method抽象メソッドを持つ抽象クラスのMyClassのインスタンスを作成することはできません" 与えます。うーん、意味がある。その名前のメソッドを作成するだけです。

class MyClass(MyABC): 
    def my_abstract_method(self): 
     pass 

MyClass() 

ブーム。あなたは終わった。しかし、この事件はどうですか?

from abc import ABCMeta, abstractmethod 

class MyABC(metaclass=ABCMeta):  
    @property 
    @abstractmethod 
    def my_attribute(self): 
     pass 

class MyClass(MyABC): 
    def my_attribute(self): 
     pass 

MyClass() 

my_attributeがプロパティではないにもかかわらず、MyClass()呼び出しが機能します。私は結局すべてのABCは、特定の名前のメソッドが存在することを保証することになると思います。それでおしまい。それ以上のことを望むなら、MyABCのソースコードを見て、ドキュメントを読む必要があります。デコレータとコメントは、サブクラスをどのように構築する必要があるかを伝えます。

私はそれが正しいですか、私はここに何かを逃していますか?

+0

これが、「抽象プロパティ」の目的です。 – user2357112

+0

'' abstractproperty''はPython 3.3では廃止されました。 OPに3.3+の正しい使用法があります。 '' @ property''と '' @ abstractmethod''を一緒に基底クラスに、 '' @ property''をサブクラスに追加しました。しかし、それを正しく実装するためにサブクラスを強制することはできません。 –

答えて

1

ABCがそれを強制していないのは間違いありません。 「特定のデコレータを持っている」のようなものを強制する方法はありません。デコレータはオブジェクトを返す関数です(例:propertyはプロパティオブジェクトを返します)。 ABCMetaは、クラスの定義された属性が特に何かを保証するために何もしません。彼らがそこにいることを確認するだけです。エラーなしでこの「作品」:

class MyABC(metaclass=ABCMeta): 
    @abstractmethod 
    def my_abstract_method(self): 
     pass 

class MyClass(MyABC): 
    my_abstract_method = 2 

MyClass() 

で、ABCMetaでもサブクラスに提供される抽象メソッドはまったく方法であることを保証しません。特定の属性に特定の種類の値があることを確認するために、より洗練されたチェックを行う独自のメタクラスを作成できますが、これはABCMetaの範囲を超えています。

+0

ありがとうございます。私は、ABCが特定のデコレータを正確に確認できるのは、クラスインスタンスが返される理由(定義されている方法によって異なります)だと思いました。 isinstance()はそこでチェックを行うのに使うことができるようです。 すべてです。私は私の「静的タイプ」ファンボーイの同僚を幸せにする方法を考えようとしていました。私は、ABCを使ってインターフェースを強制することができると読んでいますが、そうではありません。 – VagueAdvice

+0

@VagueAdvice:私がデコレータについて言いたいのは、その値がデコレータやその他の手段で作成されたものであるかどうかではなく、その属性が持つタイプの値を強制できることです。 (しかし、とにかくABCでそれをすることはできません)。静的なタイプのファンボーイを満足させたい場合は、新しい 'typing'モジュールを見たいかもしれません。 – BrenBarn

+0

私はyaを得る。 'タイピング'のヒントをありがとう。私はそれらの男の子ファンボーを呼び出すことについて冗談を言っていました。明らかに静的な型付けには大きな利点があります。私たちはここでスタックを変更しようとしています。私はPythonのためにプッシュしたいと思います。彼らはこれを大きな弱点として引き上げました。私はちょうどそこにあるものを見たいと思っていて、ABCsに出くわしました。 lypとしてのmypyのヒントをタイプすると(IDE警告とともに)、その原因を助けるかもしれません。 – VagueAdvice

関連する問題