📜  Python中的私有方法

📅  最后修改于: 2022-05-13 01:54:35.644000             🧑  作者: Mango

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