经过一些实验,我发现Python中有些古怪的东西(对于专家来说可能很明显,在这种情况下请原谅我)。 也就是说,与C ++相反,可以使用两种不同的语法来调用python类方法。我将通过一个简单的类给出两个最小的工作示例,该类仅包含一个integer属性,并可以向其添加另一个整数。首先是C ++。
#include <iostream>
using namespace std;
class MyClass
{
int value;
public:
MyClass(int arg){value=arg;}
int add(int arg){return arg+value;}
};
int main()
{
MyClass anObject(4);
cout<<"The addition gives "<<anObject.add(6)<<endl;//Outputs 10
//cout<<"The alternative way to call the method gives "<<MyClass.add(anObject, 6)<<endl; //Does not work
//cout<<"Another alternative way to call the method gives "<<MyClass::add(anObject, 6)<<endl; //Does not work either
return EXIT_SUCCESS;
}
和python。
class MyClass(object):
def __init__(self, arg=3):self.value=arg
def add(self, arg):return arg+self.value
anObject=MyClass(4)
print(anObject.add(6)) #The C++ way, Outputs 10
print(MyClass.add(anObject, 6)) #Outputs 10
很显然,这不是我要解决的问题,但是这个问题的目的是要讨论为什么选项2成为python的功能,而在C ++中却不是选项2?它是否遵循某种语言的更深层次的设计哲学,还是与语言的编译与解释性质有关?相关,为什么self
在python中显示为伪参数,但在C ++中却不显示?
答案 0 :(得分:2)
Python类是运行时对象。每个对象都带有一个__class__
指针。
执行obj.foo(x)
时,它首先会在本地查找foo
方法;如果找不到它,它将调用obj.__class__.foo(obj, x)
。
在C ++中,类不是运行时对象。具有虚拟方法或继承的对象具有一个vtable,但该vtable不是类,而是一种获取最小有效类型并为方法分配信息的方法。
现在您仍然可以像python一样调用C ++方法:
template<class T>
T& as_lvalue(T&&t){return t;}
std::ref( as_lvalue(&MyClass::add) )( anObject, 6 );
这使用了INVOKE概念(您可以在标准c++17之后直接使用它)和成员函数指针。
这是一个图书馆解决方案。运行时可执行文件中没有MyClass
对象。