从任何给定的modu中查找特定类

2024-03-30 01:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

一般情况:

  • 我不知道我将事先检查哪些模块,我不知道它们将包含什么:类、方法等
  • 我知道我在找什么职业,我需要用它做什么。e、 我需要运行一个特定的方法,时钟寄存器你知道吗
  • 我需要找到最有效的方法。你知道吗

我甚至还没有得到具体的代码,或者我会发布它。不过,我想我有一些选择:

  1. 只需通过try/except运行模块中的所有内容
  2. if/else寻找我需要的方法
  3. 使用inspect查找模块中类的精确匹配
  4. 使用元类添加属性this_is_class_sought=True

1-3看起来太粗糙了,4看起来太费劲了。你知道吗

我的情况:

我正在尝试将flasky与an application creator/factory集成。
我有一堆视图文件,我不知道这些文件中会有什么。我需要找到所有子类FlaskView的类,而不是FlaskView本身,然后运行类注册函数。你知道吗

因此,例如从dir(a_module)对于随机遇到的模块:

['FlaskView', 'AView', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'forms', 'models', 'redirect', 'render_template', 'request', 'url_for']

我需要确定AView是否存在,并运行注册方法。3,上面似乎有可能,但我还没有确定如何区分AView。你知道吗

最好的方法是什么?你知道吗

编辑:

我必须强调的是,我不知道我将看到什么模块,或者它们将包含什么。我需要有效地提取我需要的信息,并根据这些信息采取行动。你知道吗

编辑2:

为了我的目的,子类简化了很多。你知道吗


Tags: 模块文件方法代码信息编辑情况时钟
1条回答
网友
1楼 · 发布于 2024-03-30 01:36:46

听上去你想做些粗俗的事,但是。。。我无论如何都会帮忙的。如果选项4是一个选项,那么我建议改用自注册元类/基类。你知道吗

看看这个答案:Generic Python metaclass to keep track of subclasses

为完整性而复制

def sublass_registry():
    ''' Create a metaclass to register subclasses '''

    class SublassRegistryMeta(type):
        def __init__(cls, name, bases, classdict):
            if classdict.get('__metaclass__') is SublassRegistryMeta:
                SublassRegistryMeta.lineage = [cls] # put root class at head of a list
            else:
                # sublclasses won't have __metaclass__ explicitly set to this class
                # we know they're subclassees because this ctor is being called for them
                SublassRegistryMeta.lineage.append(cls) # add subclass to list
            type.__init__(cls, name, bases, classdict)

    return SublassRegistryMeta

def subclasses(cls):
    ''' Return a list containing base and subclasses '''

    try:
        if cls.__metaclass__.lineage[0] is cls: # only valid for a root class
            return cls.__metaclass__.lineage
    except AttributeError:
        pass
    return None

class Car(object): # root class
    __metaclass__ = sublass_registry()

class Audi(Car): # inherits __metaclass__
    pass

class Ford(Car): # inherits __metaclass__
    pass

class Audi2(Audi): # sub-subclass also inherits __metaclass__
    pass

print subclasses(Car)
# [<class '__main__.Car'>, <class '__main__.Audi'>, <class '__main__.Ford'>, <class '__main__.Audi2'>]
print subclasses(Audi)
# None

或者,只要用一些issubclassisinstance循环就可以了。一般来说,你不需要任何尝试/除了这里,但为了安全起见,你可以添加一些。你知道吗

相关问题 更多 >