如何在python中实现c++类成员的等价物,返回指向另一个类的指针?

How does one implement in python the equivalent of a C++ class member that returns a pointer to another class?

本文关键字:返回 指针 另一个 等价物 成员 python c++ 实现      更新时间:2023-10-16

具有c++背景,我目前正在尝试学习Python,并试图了解如何编写没有指针的代码。在一个具体的例子中,我想知道如何在Python中实现以下c++代码:

class Room: public MapSite
{
public:
Room(int roomNo);
MapSite* GetSide(Direction) const;  // Direction is an enum
void SetSide(Direction, MapSite*);
virtual void Enter();    // An inherited method from MapSite class
private:
MapSite* sides(4);
int  roomNo;
}

上面的例子来自

设计模式:可重用的面向对象软件的元素

我想知道如何在Python中实现上述功能,特别是GetSide()函数和使用指向另一个类的指针的sides变量。谢谢你。

<标题>编辑:

我最初想知道的是,如何以python的方式实现我提供的c++类,但一开始并没有完全实现。我现在意识到这个要求太宽泛了,尽管其中一些答案对我很有帮助,并使我走上了正确的道路。

问题是任何变量或属性在Python中都是引用。如果你想把一个对象存储为一个类的属性,只需赋值它;Python存储引用

与c++的一些区别:在Python中,一切都是对象,变量包含对对象的引用,而不是对象本身。如果你想要一个类的对象有属性,在构造函数__init__中赋值它们。包括构造函数在内的每个成员函数都有第一个参数self。每当你调用成员使用属性a时,你必须添加self。F()和self.a。请注意,实际上您一直在使用"未引用指针"(引用)。对于c++程序员来说,一个主要的陷阱是认为可以在函数形参中返回一个值,因为它是一个引用。但是,如果在函数内部给函数形参赋值,那么它之后将是对新赋值对象的引用。因此调用者传递的对象不会被改变。我建议你学习一些Python教程,并注意Cython,因为它可以让你将c++和Python知识结合起来。

你的程序看起来像这样:

class Room (MapSite):
    def __init__ (self, room_no):
        self._room_no = room_no
        self._map_site = None
    def get_side (self, direction):
        return ...
    def set_side(self, direction, map_site):
        ...
    # No need to define enter since it is inherited

我将尽可能多地解释代码中的每一行

class Room: public MapSite {

声明一个继承MapSite的类Room,你可以这样做

class Room(MapSite):
在Python中

。这里MapSite也必须是一个要继承的类。

公众:房间(int roomNo);

要在类中声明构造函数,可以在Python中使用__init__

def __init__(self, roomNo)

现在,如何在Python中编写enum ?你可以通过enum模块做到这一点请参考:我如何表示'枚举'在Python中?

关于c++中的privatepublic关键字,您不需要在这里直接使用它们,因为Python中没有定义这些令牌。

我不知道你还需要多少帮助。如果你能在问题中描述清楚一些就更好了。

祝你学习Python顺利!我大约在9年前从c++切换到c++,现在用c++编程感觉就像石器时代。

在Python中,每次传递一个对象时,都会传递引用,从而使指针过时。所以你的Python代码可以简单地写成:

class Room(MapSite):
    def __init__(self, roomNo):
        self.__roomNo = roomNo
        self.__sides = []
    def GetSide(direction):
        return self.__sides[direction]  # Presumably
    def SetSide(direction, side):
        self.__sides[direction] = side
    def Enter():
        # Your code here...

在Python中,所有函数都被视为虚函数。成员前的双下划线使其为"私有"。'this'指针在Python中是显式的,按照惯例被称为'self'。

所有成员变量都应该在构造函数('init'函数)中定义,直接在类作用域中定义的成员相当于c++的静态成员。