继承和“self”引用的问题

3 投票
1 回答
599 浏览
提问于 2025-04-16 02:55

这是我第一次发帖,所以首先我想对StackOverflow社区说声“谢谢!”因为这里的回答真的帮了我很多 :)

我在处理Python的继承时遇到了一个问题。

我有一个父类,里面包含以下代码:

def start(self):

  pid = os.fork()

  if (pid==0):
   self.__do_in_forked_process()
  elif(pid > 0):
   self.__do_in_parent_process()
  else:
   print ("Error while forking...")
   sys.exit(1)

这个__do_in_forked_process()方法里有一个方法self.__manage_request(),这个方法在父类中定义,但在子类中被重写了。

在子类中,当我使用self.start()方法时,问题就出现了:执行的self.__manage_request()方法是父类中定义的那个,而不是子类中定义的那个(即使我认为,当我调用self.start()时,start方法和里面的所有内容应该指向子类的对象,而不是父类的对象)。

提前谢谢大家!

turkishweb

1 个回答

6

不要在你的方法和其他属性名称前面加两个下划线:这两个下划线是专门用来区分父类和子类的,而这正是你不想要的!把你提到的方法改名为 _manage_request(只加一个下划线),这样就可以了,之后就能顺利使用了。以后只有在你非常确定不想让子类覆盖这个属性(方法其实也是一种属性)的时候,才可以使用两个下划线。

在C++的术语中,单个下划线表示 protected:子类可以访问和覆盖这个属性。而两个下划线则表示 private:这意味着即使是子类也不能碰这个属性(并且编译器会做一些名字处理来确保这一点)。我很少看到有人能清楚地理解并有目的地使用两个下划线。

撰写回答