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类和继承关系。