Python 中的访问修饰符:公有、私有和受保护
访问修饰符被像 C++、Java、Python 等面向对象编程语言用来限制从类外部访问类成员变量和方法。封装是面向对象编程的一个原则,它使用访问修饰符(如公有、私有和受保护)来保护类的内部数据。
Python 支持三种类型的访问修饰符:公有、私有和受保护。这些访问修饰符限制了从类外部的任何对象访问类成员变量和方法。
公有访问修饰符
默认情况下,成员变量和方法是公有的,这意味着它们可以从类外部或内部的任何地方访问。不需要使用 public 关键字来使类或方法和属性成为公有的。这是一个公有访问修饰符的示例:
示例
学生类有两个成员变量,name 和 age,以及一个打印成员变量值的方法 display。这两个变量和方法都是公有的,因为没有为它们分配特定的关键字。
class Student: def __init__(self, name, age): self.name = name self.age = age def display(self): print("Name:", self.name) print("Age:", self.age) s = Student("John", 20) s.display()
输出
Name: John Age: 20
私有访问修饰符
使用私有访问修饰符的类属性和方法只能在定义它们的类中访问,不能从类外部访问。在 Python 中,私有属性和方法通过在声明之前添加两个下划线 ('__') 前缀来声明。
示例
BankAccount 类被声明为具有两个私有变量,即 account_number 和 balance,以及一个私有属性 display_balance,它打印银行账户的余额。由于属性和方法都是私有的,因此在从类外部访问它们时会引发 AttributeError 错误。
class BankAccount: def __init__(self, account_number, balance): self.__account_number = account_number self.__balance = balance def __display_balance(self): print("Balance:", self.__balance) b = BankAccount(1234567890, 5000) b.__display_balance()
输出
AttributeError: 'BankAccount' object has no attribute '__display_balance'
受保护访问修饰符
使用受保护访问修饰符的类属性和方法可以在类内部以及继承受保护类的类中访问。在 Python 中,受保护的成员和方法通过在名称之前添加单个下划线 ('_') 前缀来声明。
示例
Person 类有两个受保护的属性,即 _name 和 _age,以及一个受保护的方法 _display,它显示 Person 类属性的值。Student 类继承自 Person 类,并添加了一个额外的属性 _roll_number,它也是受保护的,以及一个公有方法 display,该方法通过创建 Student 类的实例来调用父类(即 Person 类)的 _display 方法。我们可以从类外部调用 display 方法,因为 display 方法是私有的,它调用 Person 类的受保护的 _display 方法。
class Person: def __init__(self, name, age): self._name = name self._age = age def _display(self): print("Name:", self._name) print("Age:", self._age) class Student(Person): def __init__(self, name, age, roll_number): super().__init__(name, age) self._roll_number = roll_number def display(self): self._display() print("Roll Number:", self._roll_number) s = Student("John", 20, 123) s.display()
输出
Name: John Age: 20 Roll Number: 123
结论
在本文中,我们了解了三种访问修饰符,它们在 Python 和其他面向对象编程语言中用于数据隐藏和保护。公有、私有和受保护是 Python 中使用的三种访问修饰符。类的公有属性和方法可以从类外部或内部的任何地方访问。私有成员变量和属性只能在声明这些属性和方法的类中访问。当我们需要从类内部以及从继承该类的类中访问类的属性和方法时,使用受保护的访问修饰符。