定义类时执行什么代码?

时间:2011-10-29 20:57:27

标签: c++ python class metaprogramming introspection

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


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

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

5 个答案:

答案 0 :(得分:5)

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

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.

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

您可能对metaclasses感兴趣,{{3}}是控制类创建的类。

答案 3 :(得分: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
>>> 

然而,我从未见过这样做,也无法想到这样做的理由 - 它感觉相当不熟悉。

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

答案 4 :(得分:0)

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

编译C ++:导入时类已经存在;没有办法控制它们的创建方式。