2017-01-22 12 views
0

Python型アノテーションで '親クラスをサブクラス化するオブジェクト'をどのように参照しますか?Python 3タイプの注釈とサブクラス

例:FooBaseは、Foo1,Foo2などがサブクラス化された抽象基本クラスです。関数がFooBaseの子孫を受け入れるようにします。これは行います:

def do_something(self, bar:FooBase): 
    pass 

それともこれが唯一もちろんFooBaseが抽象的であることを考えると不可能である、クラスFooBaseのオブジェクトを受け入れますか?その場合、すべてのケースのうちUnionを構築する必要がありますか(神様、私は願っていません!)、あるいは他の方法でこの関係を抽象的に表現できますか?

答えて

1

注釈do は意味を持ちます。 bar:strを使用することができますが、関数はのいずれかのオブジェクトを受け取ります。それらは書類の形式に過ぎません。

いずれの場合も、通常はサブクラスを含むように定義されています。静的型付き言語でも同じであることを考慮してください.C++またはJavaの書面ではf(T param)は、の型Tまたはサブクラスを渡すことができます。そうでなければ、サブクラスのポイントは何ですか?

+0

あなたは[PEP 484](https://www.python.org/dev/peps/pep-0484/)を認識していますか? *定義された意味がある*。実行時に強制されないという理由だけで、あなたが書いていることが意味をなさないというわけではありません。 – poke

0

これはクラスFooBaseのオブジェクトのみを受け入れますか?

いいえ、これはサブクラスも受け入れます。これは、タイプヒンティングPEPの理論、具体summary of Gradual Typing sectionに記載されている:

t1t2のサブタイプである場合種類t1タイプt2と一致しています。 (しかし、それ以外の方法ではありません)

タイプヒントを扱う際には、それ以降のポインタを参照してください。

すべてのケースの連合を構築する必要があります。

でも、すべてのサブクラスはUnionから削除され、サブクラスはスキップされます。 Unionを作成してみてください、あなたが言及:

typing.Union[Foo1, Foo2, FooBar] 

と結果はFooBarする必要があります。抽象クラスであるという事実はここでも違いはなく、Python自体はtypingモジュールで多くの抽象クラスを使用しています。

例えば、Sized abcをとります。 Sizedと機能を示唆しても、仮想のサブクラス(__len__を定義するクラス)が置換されることを可能にする:

def foo(obj: Sized): pass 

foo([1, 2, 3, 4]) # ok 
foo([2, 3, 4, 5]) # ok 
0

継承はまた、注釈付きタイプに適用されます。サブタイプがFooBaseFooのインスタンスも、タイプFooBaseの有効なオブジェクトです。したがって、FooBaseオブジェクトだけでなく、Fooオブジェクトも関数に渡すことができます。

あなただけサブクラスFooBarに機能を制限したい場合は、Type[C]構造を見てかかることがあります:The type of class objectsを。

関連する問題