Python __subclasses __()未列出子类
我似乎无法使用__subclasses__()
方法列出所有派生类。这里是我的目录布局:Python __subclasses __()未列出子类
import.py
backends
__init__.py
--digger
__init__.py
base.py
test.py
--plugins
plugina_plugin.py
从import.py
我打电话test.py
。 test.py
依次迭代plugins
目录中的所有文件并加载它们全部。 test.py
看起来是这样的:
import os
import sys
import re
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__)))))
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins'))
from base import BasePlugin
class TestImport:
def __init__(self):
print 'heeeeello'
PLUGIN_DIRECTORY = os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins')
for filename in os.listdir (PLUGIN_DIRECTORY):
# Ignore subfolders
if os.path.isdir (os.path.join(PLUGIN_DIRECTORY, filename)):
continue
else:
if re.match(r".*?_plugin\.py$", filename):
print ('Initialising plugin : ' + filename)
__import__(re.sub(r".py", r"", filename))
print ('Plugin system initialized')
print BasePlugin.__subclasses__()
的问题我们,__subclasses__()
方法不显示任何派生类。 plugins
目录中的所有插件都来自base.py
文件中的基类。
base.py
看起来是这样的:
class BasePlugin(object):
"""
Base
"""
def __init__(self):
pass
plugina_plugin.py
看起来是这样的:
从基地进口BasePlugin
class PluginA(BasePlugin):
"""
Plugin A
"""
def __init__(self):
pass
谁能帮我这个?我做错了什么?我绞尽脑汁,但我似乎无法解决这个问题
谢谢。
没有其他base.py文件。我在使用Python 2.6的WinXP(SP2)上。我在我的test.py
文件中添加了另一个类,名为PluginB
,它使用BasePlugin
作为基类。当我做了
print PluginA.__mro__
print PluginB.__mro__
我:
(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>)
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>)
正如你可以看到,他们使用相同的基本插件,但合格的名称是不同的两种。这是因为在plugina_plugin.py
我进口BasePlugin
这样的:
from base import BasePlugin
相反的:
from backends.digger.base import BasePlugin
修复这个固定。
感谢您挖掘这个问题!谁会认为具有两个不同限定名称的对象有两个独立的别名! – advait 2011-08-30 18:32:08
也许插件找到另一个base.py
隐藏在某处(例如插件目录)。
与python -v
运行,看看两个不同的base.py
越来越进口
你也可以看看PluginA.__mro__
并确认在BasePlugin
有正确的
您是否看到消息'Initialising plugin:plugina_plugin'? – unutbu 2010-06-15 19:42:42
是的。它弹出。看起来类甚至被导入,但'__subclasses__'方法由于某种原因没有列出它。 – 2010-06-15 19:48:13
我一直无法重现该问题。 '打印BasePlugin .__子类__()'产生'[]''。也许如果你复制目录结构并将代码放在最简单的可能的形式下(如果问题依然存在,那么每次更改都要测试),在某个中间阶段,你会发现问题的根源。例如,摆脱test.py中的所有无关代码,简化目录结构,摆脱import.py等等。 –
unutbu
2010-06-15 20:12:54