当我导入一个具有类的模块时,首次读取该类并创建类对象时将执行哪些代码?有什么方法可以影响发生的事情吗?定义类时执行什么代码?
编辑:我知道我的问题可能有点太笼统......
我在找东西更低水平,这将使我从C做反省++。我用Python扩展了我的C++应用程序。我有一些在C++中定义并在Python中公开的类。用户可以从脚本中继承这些类,并且我希望能够在第一次定义它们时获取它们的详细信息。
当我导入一个具有类的模块时,首次读取该类并创建类对象时将执行哪些代码?有什么方法可以影响发生的事情吗?定义类时执行什么代码?
编辑:我知道我的问题可能有点太笼统......
我在找东西更低水平,这将使我从C做反省++。我用Python扩展了我的C++应用程序。我有一些在C++中定义并在Python中公开的类。用户可以从脚本中继承这些类,并且我希望能够在第一次定义它们时获取它们的详细信息。
许多可能发生的事情。最基本的:
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对象的细节....我想。很明显,我的回答并没有解决这个问题,但是在编辑问题之前,这个问题才更清楚地说明了这个意图。 –
您可能感兴趣metaclasses,它们是控制类的创建的类。
定义继承自B和C的类A执行:A = type('A', (B, C), m
其中m是包含类成员的字典。
您可以使用元类编程来影响进程。没有短缺blog posts和tutorials on the subject。
类定义中的代码与任何其他代码一样执行,但创建的任何变量(包括函数定义)都将位于类的上下文中,而不是全局的。这意味着您可以通过添加条件代码中动态地更改类定义:
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。正如其他人指出的,还有许多其他方式来修改类的行为,包括元类,继承和类装饰器。
Python被解释,所以当一个Python模块被导入时,模块级别的任何类代码都会被运行,以及这些类的元类 - 这就是类的存在。
编译C++:类在导入时已经存在;没有办法控制它们是如何创建的,因为它们已经被创建。
执行什么代码来实际创建类取决于它是旧式还是新式类 - 您是否有首选的Python版本? – Thomas
@Thomas然后让它成为Python 3。 –