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

这种方法的一个缺陷是它可能使用户能够比你想要的更多.他们可以通过提供名称来调用该命名空间中的任何单参数函数.您可以通过一些检查来帮助防范这种情况(例如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__等) – 可能无法利用,但并不完美.

>从子类树构造查找字典.使所有类继承自单个基类.创建所有类后,检查所有基类并从中填充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中注册任何创建的类.对于这种情况,这可能有点过头了 – 但它在一些“用户插件”场景中很有用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值