Форум сайта python.su
0
Имеем такой код:
class Base(object): class ChildA(object): def register(self, parent): pass class ChildB(object): def register(self, parent): pass def __init__(self): # ???
Отредактировано andrews (Июнь 10, 2013 07:59:45)
Офлайн
568
# -*- coding:utf-8 -*- class Meta(type): def __new__(cls, name, base, dct): dct.update(class_list=list()) for v in dct.values(): if hasattr(v, "register"): dct["class_list"].append(v) return super(Meta, cls).__new__(cls, name, base, dct) class BaseChild(object): def register(self): print "register ", self, "parent", self.parent class Base(object): __metaclass__ = Meta class ChildA(BaseChild): pass class ChildB(BaseChild): pass def __init__(self): for cls in self.class_list: obj = cls() obj.parent = self setattr(self, cls.__name__.lower(), obj) obj.register() a = Base()
Офлайн
15
Я вот так сделал:
import inspect class Base(object): def __init__(self): self.childs = inspect.getmembers(self, inspect.isclass) # получил все классы self.childs = [child for child in self.childs if not child[0].startswith('__')] # убрал из них лишнее for child in self.childs: cls = child[1] inst = cls() inst.register('some_parent') class ChildA(object): def register(self, parent): pass class ChildB(object): def register(self, parent): pass b = Base()
Отредактировано buddha (Июнь 10, 2013 10:08:16)
Офлайн
0
Благодарю за ответы. Предполагал, что это можно сделать через метаклассы, но не знал как их применить для данной задачи. Думаю остановиться на варианте, предложенном FishHook
Офлайн
32
FishHookВ чем целесообразность делать это через метаклассы?
Офлайн
568
o7412369815963, так Вы предложИте, там и посмотрим, что получится целесообразней
Офлайн
32
FishHookНу, например так - то же самое, но метакласс заменил на класс:
o7412369815963, так Вы предложИте, там и посмотрим, что получится целесообразней
class Meta(object): @property def class_list(self): for v in map(lambda k:getattr(self, k), dir(self)): if hasattr(v, "register"): yield v class BaseChild(object): def register(self): print "register ", self, "parent", self.parent class Base(Meta): class ChildA(BaseChild): pass class ChildB(BaseChild): pass def __init__(self): for cls in self.class_list: obj = cls() obj.parent = self setattr(self, cls.__name__.lower(), obj) obj.register() a = Base()
Офлайн