欢迎光临散文网 会员登陆 & 注册

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

2023-07-18 17:16 作者:我不是k_  | 我要投稿

今天写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"

示例2:

class Parent:    

    def B(self):        

        self.__A()  # 在父类的B方法中调用A方法    

    def __A(self):        

        print("Parent's A method")

class Child(Parent):    

def B(self):        

    return super(Child, self).B()  # 使用super()调用父类的B方法    

def __A(self):  # 子类没有成功重写        

    print("Child's A method")# 创建子类对象

child_obj = Child()# 实际上调用父类的__A方法

# 输出:"Parent's A method"

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

示例:

class Parent:    

    def B(self):        

        self._A()  # 在父类的B方法中调用A方法    

    def _A(self):        

        print("Parent's A method")

class Child(Parent):    

def B(self):        

    return super(Child, self).B()  # 使用super()调用父类的B方法    

def _A(self):  # 子类成功重写        

    print("Child's A method")# 创建子类对象

child_obj = Child()# 实际上调用子类的_A方法

# 输出:"Child's A method"


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


Python中的方法重写与名称修饰的评论 (共 条)

分享到微博请遵守国家法律