Найти - Пользователи
Полная версия: Можно ли как-то получить список всех вложенных классов?
Начало » Python для новичков » Можно ли как-то получить список всех вложенных классов?
1
andrews
Имеем такой код:
    class Base(object):
        class ChildA(object):
            def register(self, parent):
                pass
     
        class ChildB(object):
            def register(self, parent):
                pass
     
        def __init__(self):
            # ???        

хотелось бы в конструкторе класса Base получить список всех его вложенных классов, создать экземпляры и вызвать метод register.
FishHook
# -*- 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()
buddha
Я вот так сделал:
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()
andrews
Благодарю за ответы. Предполагал, что это можно сделать через метаклассы, но не знал как их применить для данной задачи. Думаю остановиться на варианте, предложенном FishHook
o7412369815963
FishHook
В чем целесообразность делать это через метаклассы?
Я бы наверно предложил над-класс с property class_list
FishHook
o7412369815963, так Вы предложИте, там и посмотрим, что получится целесообразней
o7412369815963
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()
Обычно метаклассы используют там где “штатно” не выходит. Конечно на метаклассах тоже вариант, и можно было-бы пойти дальше - заюзать какие-нибудь C-extention, но зачем?
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