Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 22, 2011 08:13:29

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как подключить и инициализировать класс, зная его имя?

в пхп это бы выглядело так:

$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 - не хочет работать
как-то не очень понимаю



Офлайн

#2 Апрель 22, 2011 08:31:49

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

как подключить и инициализировать класс, зная его имя?

функция __import__



Офлайн

#3 Апрель 24, 2011 14:09:15

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как подключить и инициализировать класс, зная его имя?

спасибо
появилась другая проблема:

        
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__ её не принимает



Офлайн

#4 Апрель 24, 2011 18:23:30

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как подключить и инициализировать класс, зная его имя?

Игнат
как создать объект этого полученного модуля?
его не надо создавать, его надо использовать.
если в нем класс - тогда создать экземпляр этого класса или типо того…
item = getattr(modi,mod)()

Офлайн

#5 Апрель 27, 2011 21:20:02

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как подключить и инициализировать класс, зная его имя?

отлично, спасибо
вот код подгрузки модулей:

        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()

у меня правильных код или его можно улучшить?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version