在Python中,封装和访问修饰符是面向对象编程的两个重要概念。封装是面向对象编程中的一个核心特性,它隐藏对象的内部状态并防止直接访问。访问修饰符则用于控制类成员(属性或方法)的可见性和可访问性。

二、封装

封装是Python中的一个重要特性,它允许我们将数据和操作数据的函数绑定到一起,形成一个“黑盒子”。我们可以通过定义类来实现封装。下面是一个简单的例子:

class Car:
    def __init__(self, brand, model, year):
        self.brand = brand
        self.model = model
        self.year = year

    def get_info(self):
        return f"{self.year} {self.brand} {self.model}"

在这个例子中,我们创建了一个名为Car的类,封装了品牌、型号和年份等属性,以及一个用于获取车辆信息的方法。外部无法直接访问内部属性,只能通过get_info方法获取信息。

三、访问修饰符

Python使用三个访问修饰符来控制类成员的可见性和可访问性:

  1. public: 默认修饰符,表示成员可以被任何对象访问。
  2. private: 表示成员只能在类内部访问,无法在类外部直接访问。但是可以通过类方法间接访问。
  3. protected: 表示成员可以在类内部和子类中访问,但在类外部无法直接访问。

下面我们通过一个案例来具体说明访问修饰符的使用:

class Person:
    def __init__(self, name, age):
        self.name = name    # public
        _age = age          # private

    def get_age(self):
        return _age        # public through method

    def set_age(self, age):
        if 0 < age < 150:   # protected within class and subclasses, can be set from outside too
            _age = age
        else:
            print("Invalid age")

class Child(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self._grade = grade  # protected within Child and Person class, can be accessed from outside too

    def get_grade(self):    # public method to get grade from outside
        return self._grade  # accessing protected member _grade from within Child class

在这个例子中,Person类有两个属性:name(公开的)和_age(私有的),以及两个方法:get_age(公开的)和set_age(受保护的)。Child类从Person类继承,有一个额外的属性_grade(受保护的),以及一个公开的方法get_grade。在这种情况下,我们可以从Child类的实例中访问所有的属性,包括Person类的私有属性_age和受保护的属性_grade,但不能从Person类的实例或实例化之外直接访问这些属性。