【问题标题】:Get a subclass from a module从模块中获取子类
【发布时间】:2017-09-12 16:24:55
【问题描述】:

我想从我的 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'>

我只想要&lt;class 'tm_child.Sub'&gt;,这就是我使用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

【问题讨论】:

  • 抽象类必须有抽象方法; ABCMeta 元类的简单存在不会使类抽象。毕竟,Sub 也有 ABCMeta 作为它的元类,继承自 Base。

标签: python inheritance


【解决方案1】:

我发现它不被认为是一个抽象类,直到它有一些东西:

class Base:
    __metaclass__ = ABCMeta

print(isabstract(Base)) #=> False

class Base:
    __metaclass__ = ABCMeta

    @abstractmethod
    def method(self):
        pass

print(isabstract(Base)) #=> True

【讨论】:

  • this SO question了解更多信息
  • @Danil Speransky 我在 tm_base 中添加了抽象方法装饰器,现在当我运行我的代码时,什么都没有打印出来
  • @DanilSperansky 你能用一个例子来编辑你的代码吗?感谢您的帮助
猜你喜欢
  • 2020-10-04
  • 2014-04-05
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多