2017-09-12 10 views
-1

からサブクラスを取得し、私は私のapi.pyから私のサブクラスSubクラスオブジェクトを取得したいと思います:モジュール

import inspect 
from tm_base import Base 
import tm_child 

for k, v in vars(tm_child).iteritems(): 
if inspect.isclass(v): 
    if (Base in inspect.getmro(v) and 
       not inspect.isabstract(v)): 
     print v 

私は両方の取得api.py実行している場合:

<class 'tm_child.Sub'> 
<class 'tm_base.Base'> 

をし、私は<class 'tm_child.Sub'>のみをお勧めします。これが私がnot inspect.isabstract(v)を使用している理由です。私のコードで何が間違っているかわかりません。

ここに私の他のファイル。

tm_base.py

from abc import ABCMeta 

class Base(object): 
    __metaclass__ = ABCMeta 

tm_child.py

from tm_base import Base 

class Sub(Base): 
    pass 
+0

抽象クラスを持っている必要がありますが抽象メソッド。 ABCMetaメタクラスの単純な存在はクラス抽象化をしません。結局のところ、SubはBaseから継承したメタクラスとしてABCMetaも持っています。 – user2357112

答えて

0

私はそれが何かを持ってまで、それは抽象クラスと考えられていないことがわかりました:

class Base: 
    __metaclass__ = ABCMeta 

print(isabstract(Base)) #=> False 

class Base: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def method(self): 
     pass 

print(isabstract(Base)) #=> True 
+0

[this](https://stackoverflow.com/questions/14410860/determine-if-a-python-class-is-an-abstract-base-class-or-concrete/14410942)のこれに関するさらに詳しい質問 – Adelin

+0

@Danil Speransky抽象メソッドデコレータをtm_baseに追加しました。コードを実行しても何も表示されません。 – diegus

+0

@sparkvillaこれは、すべての抽象クラスの実装を提供していない場合、あなたの 'Sub'も抽象クラスになるためです。メンバー。 –

関連する問題