定义类时执行的代码
What code is executed when a class is being defined?
当我导入一个具有类的模块时,当第一次读取该类并创建类对象时执行什么代码?我有什么办法可以影响事情的发展吗?
编辑:我意识到我的问题可能有点太笼统了…
我正在寻找一些更低级的东西,这将允许我从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.
我相信其他位也可以运行,这些只是我熟悉的
定义从B和C继承的类a执行:A = type('A', (B, C), m
,其中m是包含类成员的字典。
您可以使用元类编程影响流程。关于这个主题的博客文章和教程比比皆是。
您可能对元类感兴趣,元类是控制类创建的类。
类定义中的代码像任何其他代码一样执行,但创建的任何变量(包括函数定义)将在类的上下文中而不是全局。这意味着您可以通过添加条件代码来动态更改类定义:
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
>>>
然而,我从来没有见过这样做,也想不出这样做的理由——感觉相当不python。
正如其他人所指出的,有很多其他的方法可以修改一个类的行为,包括元类、继承和类装饰器。
Python是解释的,所以当一个Python模块被导入时,模块级的任何类代码都会运行,以及这些类的元类——这就是类存在的原因。
编译c++:类在导入时已经存在;没有办法控制如何创建它们,因为它们已经创建。
相关文章:
- 以下代码执行哪种内存分配(动态或静态)?
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 使用 execv 从C++代码执行的 Linux 脚本失败
- 由于找不到cpprest_2_10.dll,代码执行无法继续
- 在每次循环迭代时停止代码执行毫秒
- 与Java相比,为什么此C 代码执行速度如此慢
- 记录组件代码执行
- 相同的代码执行两次:性能差异
- 代码执行/CPU 速度每 2 秒减慢一次
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 如何将字符串从C++DLL返回到MetaTrader 4代码执行生态系统?
- 当我从java代码执行C++时不显示任何输出
- C++和共享库中的代码执行点
- 递归期间代码执行中断
- 为可选的评测代码执行进行高效设计
- 我正在尝试使用 ifstream 将此 C 函数的等效代码执行到 c++ 中
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 如何在iOS应用程序中锁定代码执行
- 中断代码执行
- 是否有一个工具来记录代码执行