2016-08-05 10 views
0

私はエディタがリファクタリングでより良くなることを期待して関数アノテーションを使用しようとしています。しかし、私は次の問題を抱えています:抽象クラスのサブクラスのための関数アノテーション

私は抽象基底クラスのアルゴリズムを持っています。

class Algorithm(metaclass=ABCMeta): 
    def __init__(self): 
      self.foo = 'bar' 

Iは、入力foo_algorithmアルゴリズムのサブクラスのいずれかのインスタンスとすることができるアルゴリズム

def get_foo(foo_algorithm): 
    return foo_algoritm.foo 

のサブクラスのインスタンスを使用する機能を有しています。この入力にどのように注釈を付けるべきですか?私はラインに沿って何かを探しています:

def get_foo(foo_algorithm: subclassof(Algorithm)): 
    return foo_algoritm.foo 

私はこれを行う正しい方法を見つけることができませんでした。

+0

あなたの質問は少し不明です。 'get_foo'が' Algorithm'のサブクラスの*インスタンス*ではなく、 'Algorithm'の*サブクラス*を受け入れるかのようにあなたは話しています。あなたのコードはそうでないと言います。 '.foo'は' __init__'メソッドで設定されているので、インスタンス属性でなければなりません。クラスオブジェクトには存在しません。 –

+0

良い点が編集されました。実際に私が使用しているインスタンス化されたサブクラスです。 – Skirrebattie

+0

まあ、今私はあなたのどちらかをカバーしています。 –

答えて

2

だけで直接Algorithmを使用します。

def get_foo(foo_algorithm: Algorithm): 
    return foo_algoritm.foo 

と自動的にサブクラスのインスタンスは、(基底クラスのすべてのサブクラスに適用され、isinstance(foo_algorithm, Algorithm)が真でなければなりません)許容されます。

あなただけにして型ヒントとしてType[Algorithm]を使用し、クラスを受け入れることができる場合:

def get_foo(foo_algorithm: Type[Algorithm]): 
    return foo_algoritm().foo 

The type of class objects sectionのPEP 484を参照してください - タイプヒント:

時にはあなたが欲しいですクラスオブジェクト、特に与えられたクラスから継承するクラスオブジェクトについて話をする。これはType[C]のように書くことができ、Cはクラスです。一方、C(注釈として使用する場合)は、クラスCのインスタンスを指し、Type[C]は、サブクラスCを指します。 .fooはあなたのコード例に係るインスタンス属性れるため

ここで私はは、クラスオブジェクトと呼ばれます。 Algorithmから派生したクラスには、そのような属性自体はありません。

関連する問題