您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用Python全局变量的动态类的最佳方法()

5b51 2022/1/14 8:22:42 python 字数 2673 阅读 572 来源 www.jb51.cc/python

我正在开发一个Web应用程序,它将根据用户输入返回一组可变模块.每个模块都是一个 Python类,其构造函数接受单个参数,并具有包含输出的“.html”属性. 从全局命名空间动态提取类的工作原理如下: result = globals()[classname](param).html 而且它肯定比以下更简洁: if classname == 'Foo': result = Foo(para

概述

从全局命名空间动态提取类的工作原理如下:

result = globals()[classname](param).html

而且它肯定比以下更简洁:

if classname == 'Foo':
    result = Foo(param).html
elif classname == 'Bar':
    ...

什么被认为是风格上写这个的最佳方式?是否存在不使用全局命名空间的风险或原因?

您有几种备选方案:

>创建显式映射:

class_lookup = {'Class1' : Class1,... }
 ...
 result = class_lookup[className](param).html

虽然这样做的缺点是你必须重新列出所有的类.
>将类嵌套在封闭范围内.例如.在他们自己的模块中或在外部类中定义它们:

class Namespace(object):
    class Class1(object):
        ...
    class Class2(object):
        ...
...
result = getattr(Namespace,className)(param).html

在这里无意中暴露了一些额外的类变量(__bases __,__ getattribute__等) – 可能无法利用,但并不完美.
>从子类树构造查找字典.使所有类继承自单个基类.创建所有类后,检查所有基类并从中填充dict.这样做的好处是你可以在任何地方定义你的类(例如,在单独的模块中),只要你在创建注册表之后创建注册表,你就会找到它们.

def register_subclasses(base):
    d={}
    for cls in base.__subclasses__():
        d[cls.__name__] = cls
        d.update(register_subclasses(cls))
    return d

class_lookup = register_subclasses(MyBaseClass)

上面的一个更高级的变体是使用自注册类 – 创建一个元类,而不是自动在dict中注册任何创建的类.对于这种情况,这可能有点过头了 – 但它在一些“用户插件”场景中很有用.

总结

以上是编程之家为你收集整理的使用Python全局变量的动态类的最佳方法()全部内容,希望文章能够帮你解决使用Python全局变量的动态类的最佳方法()所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶