Найти - Пользователи
Полная версия: как подключить и инициализировать класс, зная его имя?
Начало » Python для новичков » как подключить и инициализировать класс, зная его имя?
1
Игнат
в пхп это бы выглядело так:
$name = 'test';
include($name . '.php');
$obj = new $name();
в последнем не совсем уверен, но суть думаю ясна

в питоне:
# mod_test.py, mod_test2.py - файлы
# test(), test2() - классы в них

mods = os.listdir('include')
mods = [file.replace('mod_', '').replace('.py', '') for file in mods if 'mod_' in file and '.py' in file]
for mod in mods:
from include.mod_joiner import joiner
self.mod = mod(self)

#from getattr(include, 'mod_' + mod) import mod - не хочет работать
как-то не очень понимаю
dimabest
функция __import__
Игнат
спасибо
появилась другая проблема:
        
for mod in mods:
# mod == 'joiner'
modi = __import__('include.mod_' + mod, globals(), locals(), fromlist=True)
print(modi) # <module 'include.mod_joiner' from ...>
m = modi() # TypeError: 'module' object is not callable
как создать объект этого полученного модуля?

вроде бы сработал такой код
            print(modi)
m = object.__new__(joiner)
setattr(self, mod, m)
но “joiner” на каждой итерации разный. а если передавать строку - __new__ её не принимает
o7412369815963
Игнат
как создать объект этого полученного модуля?
его не надо создавать, его надо использовать.
если в нем класс - тогда создать экземпляр этого класса или типо того…
item = getattr(modi,mod)()
Игнат
отлично, спасибо
вот код подгрузки модулей:
        mods = os.listdir('include')
mods = [file.replace('mod_', '').replace('.py', '') for file in mods if 'mod_' in file and '.py' in file]
for mod in mods:
modi = __import__('include.mod_' + mod, globals(), locals(), fromlist=True)
m = getattr(modi, mod)(self)
setattr(self, mod, m)
он грузит из include/ все mod_*.py
создает объекты их классов (в каждом файле одноименный класс)
и делает объекты свойствми базового класса

например
mod_test.py
mod_foo.py

получаем:
self.test # test()
self.foo # foo()

у меня правильных код или его можно улучшить?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB