继承和“self”引用的问题
这是我第一次发帖,所以首先我想对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
:这意味着即使是子类也不能碰这个属性(并且编译器会做一些名字处理来确保这一点)。我很少看到有人能清楚地理解并有目的地使用两个下划线。