Nie mogę wyświetlić wszystkich klas pochodnych za pomocą metody __subclasses__()
. Oto mój układ katalogów:Python __subclasses __() nie wymienia podklas
import.py
backends
__init__.py
--digger
__init__.py
base.py
test.py
--plugins
plugina_plugin.py
Od import.py
ja dzwonię test.py
. test.py
z kolei iteruje wszystkie pliki w katalogu plugins
i ładuje je wszystkie. test.py
wygląda następująco:
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__()
Problem nam, że metoda __subclasses__()
nie wykazuje żadnych klas pochodnych. Wszystkie wtyczki w katalogu plugins
pochodzą z klasy bazowej pliku base.py
.
base.py
wygląda następująco:
class BasePlugin(object):
"""
Base
"""
def __init__(self):
pass
plugina_plugin.py
wygląda następująco:
od bazowej importowej BasePlugin
class PluginA(BasePlugin):
"""
Plugin A
"""
def __init__(self):
pass
Czy ktoś może mi pomóc z tym? Co robię źle? Wkurzyłem się o to, ale nie mogę tego rozgryźć.
Dzięki.
Czy widzisz komunikat "Inicjalizacja wtyczki: plugina_plugin'? – unutbu
Tak. Wyskakuje. Wygląda na to, że klasa jest nawet importowana, ale metoda '__subclasses__' nie wyświetla jej z jakiegoś powodu. –
Nie udało mi się odtworzyć problemu. 'print BasePlugin .__ podklasy __()' daje '[]'.Być może, jeśli skopiujesz strukturę katalogów i będziesz dalej parował kod do jego najprostszej możliwej formy (przy każdej zmianie testowania, jeśli problem pozostanie), na pewnym etapie pośrednim znajdziesz wskazówkę co do źródła problemu. Na przykład, pozbyć się całego niepotrzebnego kodu w test.py, uprościć strukturę katalogów, pozbyć się import.py, etc ... –
unutbu