2011-10-29 48 views
4

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


编辑:我知道我的问题可能有点太笼统......

我在找东西更低水平,这将使我从C做反省++。我用Python扩展了我的C++应用程序。我有一些在C++中定义并在Python中公开的类。用户可以从脚本中继承这些类,并且我希望能够在第一次定义它们时获取它们的详细信息。

+0

执行什么代码来实际创建类取决于它是旧式还是新式类 - 您是否有首选的Python版本? – Thomas

+0

@Thomas然后让它成为Python 3。 –

回答

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. 

我敢肯定,其他位可以运行为好,这些都正是我所熟悉的。

+0

我认为这个问题是关于从C++的角度来看python对象的细节....我想。很明显,我的回答并没有解决这个问题,但是在编辑问题之前,这个问题才更清楚地说明了这个意图。 –

3

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

4

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

您可以使用元类编程来影响进程。没有短缺blog poststutorials on the subject

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 
>>> 

但是我从来没有见过这样做的,想不到的理由这样做 - 那感觉相当unpythonic。正如其他人指出的,还有许多其他方式来修改类的行为,包括元类,继承和类装饰器。

0

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

编译C++:类在导入时已经存在;没有办法控制它们是如何创建的,因为它们已经被创建。