-3

经过一些实验后,我在 Python 中发现了一些奇怪的东西(对于专家来说可能很明显,在这种情况下请原谅我)。也就是说,与 C++ 不同,可以使用两种不同的语法调用 python 类方法。我将给出两个最小的工作示例,其中包含一个简单的类,它只包含一个整数属性,并且可以向它添加另一个整数。首先是 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;
}

和蟒蛇。

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++ 的一个特性的讨论?它是源于语言的一些更深层次的设计理念,还是与语言的编译与解释性质有关?相关,为什么self在 python 中显示为虚拟参数,但在 C++ 中没有?

4

1 回答 1

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 概念(在之后,您可以直接将其与 std 调用一起使用)和成员函数指针。

这是一个图书馆解决方案。运行时可执行文件中没有MyClass对象。

于 2018-11-26T03:02:40.010 回答