【问题标题】:What code is executed when a class is being defined?定义类时执行什么代码?
【发布时间】:2011-12-18 00:07:54
【问题描述】:

当我导入一个具有类的模块时,当第一次读取该类并创建类对象时会执行什么代码?有什么方法可以影响发生的事情吗?


编辑:我意识到我的问题可能有点过于笼统......

我正在寻找可以让我从 C++ 进行自省的更底层的东西。我用 Python 扩展了我的 C++ 应用程序。我有一些在 C++ 中定义并在 Python 中公开的类。用户可以从脚本中的这些类继承,我希望能够在它们首次定义时获取它们的详细信息。

【问题讨论】:

  • 执行什么代码来实际创建类取决于它是旧式还是新式类 - 你有首选的 python 版本吗?
  • @Thomas 那就让它成为 Python 3。

标签: c++ python class metaprogramming introspection


【解决方案1】:

Python 被解释,因此当导入 Python 模块时,模块级别的任何类代码都会运行,以及这些类的元类 - 这样类就会存在。

C++ 已编译:类在导入时已存在;由于它们已经创建,因此无法控制它们的创建方式。

【讨论】:

    【解决方案2】:

    类定义中的代码与任何其他代码一样执行,但创建的任何变量(包括函数定义)都将位于类的上下文中,而不是全局的。这意味着您可以通过添加条件代码来动态更改类定义:

    class A(object):
        if 1==2:
            def f(self):
                print "the world has gone mad"
        else:
            def f(self):
                print "sanity rules"
    
    >>> a = A()
    >>> a.f()
    sanity rules
    >>> 
    

    但是我从未见过这样做,也想不出这样做的理由 - 感觉相当不合时宜。

    正如其他人所指出的,还有许多其他方法可以修改类的行为,包括元类、继承和类装饰器。

    【讨论】:

      【解决方案3】:

      许多可能的事情都可能发生。最基本的:

      class 块的内容在第一次读取时执行。

      要查看实际效果,请看以下示例:

      class Foo(object):
          print "bar"
      
          def __init__(self):
              print "baz"
      

      导入模块时将打印bar

      如果一个类定义了元类,元类__new__函数将在类代码块运行后运行。

      例子:

      class MyMeta(type):
          def __new__(mcs, name, bases, kwargs):
              print "I'm the metaclass, just checking in."
              return type.__new__(mcs, name, bases, kwargs)
      
      
      class Foo(object):
          __metaclass__ = MyMeta
      
          print "I'm the Foo class"
      

      输出:

      I'm the Foo class
      I'm the metaclass, just checking in.
      

      我相信其他位也可以运行,这些只是我所熟悉的。

      【讨论】:

      • 我认为问题是关于从 c++ 角度来看的 python 对象的细节......我认为。显然我的回答没有解决这个问题,但是那是在编辑问题以更清楚地说明这一意图之前。
      【解决方案4】:

      定义一个继承自 B 和 C 的类 A 执行:A = type('A', (B, C), m 其中 m 是包含该类成员的字典。

      您可以使用元类编程来影响流程。不乏blog poststutorials on the subject

      【讨论】:

        【解决方案5】:

        您可能对metaclasses 感兴趣,它们是控制类创建的类。

        【讨论】:

          猜你喜欢
          • 2019-12-28
          • 2022-01-05
          • 2011-11-20
          • 2021-05-01
          • 1970-01-01
          • 2019-02-18
          相关资源
          最近更新 更多