【问题标题】:What means of namespace object in PythonPython中命名空间对象的含义
【发布时间】:2017-03-16 12:22:57
【问题描述】:

python3.3以后如何使用types.new_class方法?
以下是签名。

types.new_class(name, bases=(), kwds=None, exec_body=None)  

如何使用 exec_body?
exec_body 必须是可调用对象,并且需要一个参数ns。 (可能是指namespace
什么类型的对象应该传递给ns
根据new_class的文档,

exec_body 参数是一个回调,用于填充新创建的类命名空间。它应该接受类命名空间作为其唯一参数,并直接使用类内容更新命名空间。如果没有提供回调,则与传入 lambda ns: ns. 效果相同。

我不知道上面关于ns 和 exec_body 的描述的含义。
如何使用此功能?

【问题讨论】:

  • 也许从使用 lambda 开始。或者将其保留为无

标签: python function class


【解决方案1】:

命名空间是一个字典。你用你希望你的新类对象拥有的属性(包括方法)来填充它。这是一个简单的演示。

import types

def body(ns):
    def __init__(self, a):
        self.a = a

    d = {
        '__doc__': 'A test class',
        'some_cls_attr': 42,
        '__repr__': lambda self: 'Test(a={})'.format(self.a),
        '__init__': __init__,
    }
    ns.update(d)

Test = types.new_class('Test', bases=(), kwds=None, exec_body=body)

print(Test.some_cls_attr)
print(Test('hello'))
#help(Test)

输出

42
Test(a=hello)

当然,对于这个简单的示例,使用普通的类创建语法更为明智。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2013-02-22
    相关资源
    最近更新 更多