使用Python全局变量的动态类的最佳方法()
|
我正在开发一个Web应用程序,它将根据用户输入返回一组可变模块.每个模块都是一个 Python类,其构造函数接受单个参数,并具有包含输出的“.html”属性. 从全局命名空间动态提取类的工作原理如下: result = globals()[classname](param).html 而且它肯定比以下更简洁: if classname == 'Foo':
result = Foo(param).html
elif classname == 'Bar':
...
什么被认为是风格上写这个的最佳方式?是否存在不使用全局命名空间的风险或原因? 解决方法这种方法的一个缺陷是它可能使用户能够比你想要的更多.他们可以通过提供名称来调用该命名空间中的任何单参数函数.您可以通过一些检查来帮助防范这种情况(例如isinstance(SomeBaseClass,theClass),但它可能更好地避免这种方法.另一个缺点是它限制了您的类位置.如果您最终得到了几十个这样的类并决定要将它们分组到模块中,您的查找代码将停止工作.您有几种备选方案: >创建显式映射: 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__等) – 可能无法利用,但并不完美. 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 – IRR实现中使用的数值方法是什么?
- python – 用于Django项目/应用程序的RESTful API
- python – 如何克服 – 在windows上使用文件名或扩展名失败
- python – 递归地按键对嵌套的OrderedDict进行排序
- python – Scipy稀疏 – 距离矩阵(Scikit或Scipy)
- django芹菜 – 如何发送request.FILES [‘photo’]到任务
- python – igraph:为什么add_edge函数如此缓慢地对add_edg
- 有没有办法在python中的特定索引附加/扩展列表与另一个列表
- python – pandas转义回车到to_csv
- python – 将numpy.array中的每个元素与numpy.array中的每个
- python – OS X UDP发送错误:55没有可用的缓冲区
- 在IPython中使用Interactive Shell之外的魔术命令
- python – 检查待执行的Django迁移
- python-2.7 – 如何在python中使用webdriver选择
- Python functools.namedtuple
- python – “I; 16”图像文件的numpy.array
- Python:TypeError:*之后的参数必须是一个序列
- python – Django中的ValidationError
- python – 改变seaborn heatmap颜色条上的刻度尺
- 使用Python库绘制共享相同y轴的两个水平条形图
