Python中的私有方法
先决条件——
- Python类和对象
- 封装
- Python中的下划线
封装是面向对象编程(OOP)中的基本概念之一。它描述了包装数据的想法以及在一个单元内处理数据的方法。这限制了直接访问变量和方法,并且可以防止意外修改数据。类是封装的一个例子,因为它封装了成员函数、变量等所有数据。
现在,在某些情况下,我们需要对类的某些方法进行限制,使其既不能在类外访问,也不能被任何子类访问。为了实现这个私有方法开始发挥作用。
私有方法
考虑一个现实生活中的例子,一个汽车发动机,它由许多部件组成,如火花塞、阀门、活塞等。没有用户直接使用这些部件,他们只知道如何使用使用它们的部件。这就是私有方法的用途。它用于向外界隐藏任何类的内部功能。
私有方法是那些既不能在类外访问也不能被任何基类访问的方法。在Python中,不存在只能在类内部访问的 Private 方法。但是,要定义私有方法,请在成员名称前加上双下划线“ __ ”。
注意: __init__
方法是一个构造函数,并在类的对象被实例化后立即运行。
# Python program to
# demonstrate private methods
# Creating a Base class
class Base:
# Declaring public method
def fun(self):
print("Public method")
# Declaring private method
def __fun(self):
print("Private method")
# Creating a derived class
class Derived(Base):
def __init__(self):
# Calling constructor of
# Base class
Base.__init__(self)
def call_public(self):
# Calling public method of base class
print("\nInside derived class")
self.fun()
def call_private(self):
# Calling private method of base class
self.__fun()
# Driver code
obj1 = Base()
# Calling public method
obj1.fun()
obj2 = Derived()
obj2.call_public()
# Uncommenting obj1.__fun() will
# raise an AttributeError
# Uncommenting obj2.call_private()
# will also raise an AttributeError
输出:
Public method
Inside derived class
Public method
Traceback (most recent call last):
File "/home/09d6f91fdb63d16200e172c7a925dd7f.py", line 43, in
obj1.__fun()
AttributeError: 'Base' object has no attribute '__fun'
Traceback (most recent call last):
File "/home/0d5506bab8f06cb7c842501d9704557b.py", line 46, in
obj2.call_private()
File "/home/0d5506bab8f06cb7c842501d9704557b.py", line 32, in call_private
self.__fun()
AttributeError: 'Derived' object has no attribute '_Derived__fun'
上面的例子表明,类的私有方法既不能在类外访问,也不能被任何基类访问。但是,可以通过公共方法调用私有方法来访问私有方法。
例子:
# Python program to
# demonstrate private methods
# Creating a class
class A:
# Declaring public method
def fun(self):
print("Public method")
# Declaring private method
def __fun(self):
print("Private method")
# Calling private method via
# another method
def Help(self):
self.fun()
self.__fun()
# Driver's code
obj = A()
obj.Help()
输出:
Public method
Private method
名称修改
Python提供了一个魔法棒,它也可以用来调用类之外的私有方法,它被称为名称修饰。这意味着 __geek 形式的任何标识符(至少两个前导下划线或最多一个尾随下划线)都将替换为 _classname__geek,其中 classname 是当前类名,前导下划线被剥离。
例子:
# Python program to
# demonstrate private methods
# Creating a class
class A:
# Declaring public method
def fun(self):
print("Public method")
# Declaring private method
def __fun(self):
print("Private method")
# Driver's code
obj = A()
# Calling the private member
# through name mangling
obj._A__fun()
输出:
Private method