Python中的方法重写与名称修饰

发布时间 2023-07-18 17:08:58作者: 我不是k

Python中的方法重写与名称修饰
今天写python系统的时候,发现父类怎么老是调用不了子类重写的方法,整了好久才发现,python的名称修饰机制,好久没写代码了,这一块知识点忘干净了,下面进行总结。

在Python中,方法重写是面向对象编程中的重要概念,它允许子类对父类的方法进行重新定义以满足子类特有的需求。然而,在方法重写过程中,有一个有趣的机制称为名称修饰(name mangling),它影响了以双下划线开头的方法名。在本篇博客中,我们将探讨Python中的方法重写和名称修饰的工作原理和使用方法。

1. 方法重写(Method Overriding)
方法重写是指在子类中重新定义一个与父类方法名称相同的方法。这样,当通过子类对象调用该方法时,将执行子类中的方法而不是父类中的方法。方法重写使得子类可以自定义和修改父类方法的行为,实现更灵活和具有特定功能的子类。

示例:

class Parent:
    def some_method(self):
        print("Parent's method")

class Child(Parent):
    def some_method(self):  # 方法重写
        print("Child's method")

child_obj = Child()
child_obj.some_method()  # 输出:"Child's method"

2. 名称修饰(Name Mangling)
名称修饰是Python中用于避免子类意外地覆盖父类方法或属性的机制。当方法或属性的名称以双下划线__开头时,Python会在名称前面添加一个下划线和类名,形成_类名__方法名的形式。这样,即使子类定义了与父类同名的方法,实际上它们的名称并不相同,从而避免了冲突。

示例:

class Parent:
    def __some_method(self):  # 名称修饰
        print("Parent's method")

class Child(Parent):
    def __some_method(self):  # 名称修饰后,实际上成为 _Child__some_method
        print("Child's method")

child_obj = Child()
child_obj._Child__some_method()  # 输出:"Child's method"

3. 以单下划线_开头的方法名
在Python中,以单下划线_开头的方法名并不会触发名称修饰机制。这样的方法被视为内部实现细节,建议在外部使用时要谨慎。子类可以定义以单下划线开头的方法,并且与父类的同名方法不会发生冲突。

示例:

class Parent:
    def _some_method(self):  # 以单下划线开头,不触发名称修饰
        print("Parent's method")

class Child(Parent):
    def _some_method(self):  # 不触发名称修饰,与父类的 _some_method 不冲突
        print("Child's method")

child_obj = Child()
child_obj._some_method()  # 输出:"Child's method"

总结
方法重写是Python中面向对象编程的重要特性,允许子类重新定义父类的方法以实现个性化的功能。名称修饰是一种机制,用于避免子类意外地覆盖父类方法或属性,通过在名称前添加_类名来解决命名冲突问题。此外,以单下划线开头的方法名不会触发名称修饰,但应谨慎使用,避免对外部代码造成意外影响。了解方法重写和名称修饰的原理,将有助于编写更具灵活性和清晰性的Python类和继承关系。