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
类的实例并使用类名调用构造函数。
from personClass import Person
sys.path.append(".")
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 中的私有方法是通过在方法前加上两个下划线 __
来声明的。声明私有方法允许为封装类专门保留一个方法。使用私有方法扩展另一个类的类不会继承这些方法,并在尝试访问它时触发错误。
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