Python 中的私有方法

Rayven Esplanada 2023年1月30日 2021年7月12日
  1. Python 中的私有访问修饰符
  2. 在 Python 中声明一个私有方法
Python 中的私有方法

本教程演示了如何在 Python 中声明、操作和使用私有方法。

private 是面向对象编程语言中使用的一种访问修饰符的关键字。访问修饰符在一定程度上限制了函数或变量的可见性。将你的函数/变量声明为私有将访问权限仅限于封装它的类。

与私人方法的现实比较将是家庭照明系统。电灯开关和灯泡就像公共方法,因为人们可以直接访问和查看它们。同时,保护橡胶内的电线是私人方法,因为它们通常不可见,除非被篡改,但它们仍然在大多数情况下没有人注意的情况下工作。

Python 中的私有访问修饰符

在 Python 中,私有方法是不能在声明它的类之外访问的方法,也不能被任何其他基类访问。

要在 Python 中声明私有方法,请在方法名称的开头插入双下划线。

__init__() 方法

Python 中一个值得注意的私有方法是 __init__() 方法,它用作类对象的类构造函数。当类的对象被实例化时,根据方法的参数调用此方法。

例如,声明一个具有两个字段和一个 __init__() 方法的 Person 类:

class Person:
    name = ''
    age = 0
    
    def __init__(self, n, a):
        self.name = n
        self.age = a
    

现在,要访问类外的私有 __init__() 方法,我们需要它在实例化后从类本身的对象中访问它。

例如,在同一目录中的另一个文件中,创建 Person 类的实例并使用类名调用构造函数。

sys.path.append(".")

from personClass import Person

person = Person("John Doe", 25)

print(person.name, person.age)

输出:

John Doe   25
注意
要将类从另一个文件导入当前文件,请使用 sys.path.append() 和要导入的类的字符串路径目录作为参数。在这种情况下,两个文件都驻留在同一个文件夹中,因此句点 . 足够了。然后,从 .py 文件 (personClass.py) 导入类 (Person)。

在将 Person 类实例化为变量以重新实例化对象后,可以显式调用 __init__() 方法。

例如:

person = Person("John Doe", 25)
person.__init__("Jane Doe", 29)

print(person.name, person.age)

输出:

Jane Doe   29

此外,__init()__ 方法可以通过从类本身调用它来显式调用。尽管对于这种方法,你需要明确地将第一个参数 self 放入参数中。

person = Person("John Doe", 25)
Person.__init__(person, "Jack Sparrow", 46)   #person is the 'self' argument

print(person.name, person.age)

输出:

Jack Sparrow   46

所有这些方法都保留了 __init__() 方法的私有属性。

现在已经剖析了这个内置方法。让我们继续将我们自己的私有方法实际实现到一个类中,并将其访问与公共方法区分开来。

在 Python 中声明一个私有方法

要声明私有方法,请在相关方法前加上双下划线 __。否则,它将被视为默认公共方法。

让我们从前面的例子中扩展 Person 类,并创建一个子类 Employee,它的构造函数基于 Person 类。

此外,在 person 类中创建两个新方法,一个公共方法和一个私有方法。

class Person:
    name = ''
    age = 0
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def walk(self):
        print("Walking")
        
    def __call(self):
        print("Taking a call")

现在,创建扩展 Person 的派生类或子类 Employee

class Employee(Person):
    occupation = 'Unemployed'
    salary = 0
    
    def __init__(self, name, age, occupation, salary):
        Person.__init__(self, name, age)
        self.occupation = occupation
        self.salary = salary
        
    def work(self):
        print("Employee is working")
        self.walk()
        
    def takeCall(self):
        self.__call()
        print("Employee is taking a call")
注意
要将一个类扩展到另一个类,请在类声明中添加一个参数,即父类的类名。在这种情况下,参数是 Person 类。

在这个类中,work()takeCall() 方法分别从父类 Person 外部调用 walk()__call() 类。

另一个方法从外部调用公共方法,另一个方法从其父类调用私有方法。让我们看看当我们运行它时这个行为是如何工作的。

例如,给定上面的类声明:

employee_1 = Employee("John Doe", 25, "Software Engineer", 40000)

employee_1.work()
employee_1.takeCall()

输出:

Employee is working
Walking
Traceback (most recent call last):
  File "python/demo.py", line 35, in <module>
    employee_1.takeCall()
  File "python/demo.py", line 29, in takeCall
    self.__call()
AttributeError: 'Employee' object has no attribute '_Employee__call'

work() 方法的调用成功执行,打印出来自 work()walk() 方法的语句。但是,对 takeCall() 的调用会触发 AttributeError,因为它无法将 Person 类的 __call() 方法识别为 Employee 类的方法。将一个类扩展到另一个类不会在扩展中包含它自己的私有方法。

总之,Python 中的私有方法是通过在方法前加上两个下划线 __ 来声明的。声明私有方法允许为封装类专门保留一个方法。使用私有方法扩展另一个类的类不会继承这些方法,并在尝试访问它时触发错误。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

相关文章 - Python Class