当我导入一个有类的模块时,首次读取该类并创建类对象时会执行什么代码?有什么方法可以影响发生的事情吗?
编辑:我意识到我的问题可能有点过于笼统......
我正在寻找更低级别的东西,这将允许我从C ++进行内省。我用Python扩展我的C ++应用程序。我有一些在C ++中定义并在Python中公开的类。用户可以在脚本中继承这些类,我希望能够在首次定义时获取有关它们的详细信息。
答案 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 posts和tutorials 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 ++:导入时类已经存在;没有办法控制它们的创建方式。