C++ 定义类时执行什么代码?
当我导入一个有类的模块时,当第一次读取该类并创建类对象时,会执行哪些代码?我有什么办法可以影响发生的事情吗C++ 定义类时执行什么代码?,c++,python,class,metaprogramming,introspection,C++,Python,Class,Metaprogramming,Introspection,当我导入一个有类的模块时,当第一次读取该类并创建类对象时,会执行哪些代码?我有什么办法可以影响发生的事情吗 编辑:我意识到我的问题可能有点太笼统了 我正在寻找一些更低级的东西,这将允许我从C++中进行反思。我用Python扩展C++应用程序。我有一些C++中定义的类,用Python公开。用户可以在脚本中继承这些类,我希望能够在首次定义这些类时获取它们的详细信息。可能会发生很多事情。最基本的原则是: 类块的内容在第一次读取时执行 要了解这一点,请参见以下示例: class Foo(object)
编辑:我意识到我的问题可能有点太笼统了
我正在寻找一些更低级的东西,这将允许我从C++中进行反思。我用Python扩展C++应用程序。我有一些C++中定义的类,用Python公开。用户可以在脚本中继承这些类,我希望能够在首次定义这些类时获取它们的详细信息。可能会发生很多事情。最基本的原则是:
类
块的内容在第一次读取时执行
要了解这一点,请参见以下示例:
class Foo(object):
print "bar"
def __init__(self):
print "baz"
导入模块时将打印条
如果一个类定义了一个元类,那么元类\uuuuu new\uuuu
函数将在运行代码的类块之后运行
例如:
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继承的类a,并执行C:
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模块时,模块级的任何类代码都会运行,同时这些类的元类也会运行——这样类就存在了
C++是编译的:类在导入时已经存在;由于它们已经被创建,因此无法控制它们的创建方式。实际创建类所执行的代码取决于它是旧样式还是新样式的类-您有首选的python版本吗?@Thomas让它成为python 3。我认为离子是关于从C++的观点来看Python对象的细节…我想。显然我的答案并没有解决这个问题,但是在这个问题被编辑之前更清楚地陈述了这个意图。