【Python语言基础】16、封装

1.封装简介

在Python里,封装是面向对象编程的一个重要特性,它能把数据(属性)和操作这些数据的方法捆绑在一起,形成一个独立的单元,也就是类。封装还能对这些数据和方法的访问进行控制,以此增强数据的安全性和代码的可维护性。

class Person:
    def __init__(self, name, age):
        # 初始化属性
        self.name = name
        self.age = age

    def introduce(self):
        # 操作数据的方法
        print(f"我叫{self.name},今年{self.age}岁。")

# 创建一个Person对象
p = Person("张三", 25)
# 调用对象的方法
p.introduce()

在这个例子中,name和age是Person类的数据属性,introduce方法是用来操作这些数据的。它们都被封装在Person类中,形成了一个独立的单元。

1.1 访问控制

封装还可以对类的属性和方法进行访问控制,在 Python 中,通过命名约定和访问修饰符来实现

1.2 公有属性和方法

默认情况下,Python 中的属性和方法都是公有的,可以在类的外部直接访问。例如上面的name、age和introduce都是公有成员,在类的外部可以直接访问和调用:

print(p.name)
p.introduce()

1.3 私有属性和方法

在 Python 里,通过在属性或方法名前加双下划线__来表示私有成员,私有成员不能在类的外部直接访问(实际上是Python内部将名字进行了修改,修改为:_类名_属性名 )。例如:

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def __private_method(self):
        print("这是一个私有方法。")

    def introduce(self):
        print(f"我叫{self.__name},今年{self.__age}岁。")


p = Person("张三", 25)
# 下面这行代码会报错,因为不能直接访问私有属性
# print(p.__name)
# 下面这行代码也会报错,因为不能直接调用私有方法
# p.__private_method()
p.introduce()

在这个例子中,__name、__age和__private_method都是私有成员,在类的外部不能直接访问和调用。不过,可以在类的内部通过公有方法来访问私有成员,像introduce方法就可以访问__name和__age。一般在类中会通过定义getter和setter方法对私有的成员进行访问

通过封装,你可以把类的实现细节隐藏起来,只向外部提供必要的接口,这样能提高代码的安全性和可维护性

2. property装饰器

在 Python 里,property 装饰器是一个内置的装饰器,主要用于把类的方法伪装成属性,这样就可以像访问属性一样调用方法,从而让代码的使用和理解更加直观

2.1 基本使用

property 装饰器可以把一个方法转换为只读属性,以下是一个简单示例

class Circle:
    def __init__(self, radius):
        self.radius = radius

    @property
    def area(self):
        return 3.14 * self.radius ** 2


# 创建Circle类的实例
circle = Circle(5)
# 像访问属性一样访问area方法
print(circle.area)

在这个例子中,area 原本是一个方法,但通过 @property 装饰器,它被转化成了一个只读属性。所以可以像访问普通属性一样使用 circle.area 来获取圆的面积,而不需要使用函数调用的语法 circle.area()。

2.2 设置属性值

property 不仅能把方法转换为只读属性,还可以结合 @方法名.setter 装饰器来设置属性的值。示例如下:

class Person:
    def __init__(self, age):
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, new_age):
        if new_age < 0:
            print("年龄不能为负数。")
        else:
            self.__age = new_age


# 创建Person类的实例
person = Person(20)
# 像访问属性一样获取age
print(person.age)
# 像设置属性一样设置age
person.age = 25
print(person.age)
# 尝试设置负数年龄
person.age = -5

在上述代码中,@property 装饰器把 age 方法变成了一个只读属性,而 @age.setter 装饰器让 age 成为可写属性。当给 person.age 赋值时,会调用 @age.setter 装饰的方法,在这个方法里可以对输入的值进行验证。

2.3 删除属性

使用 @方法名.deleter 装饰器可以实现删除属性的功能,示例如下:

class Rectangle:
    def __init__(self, width, height):
        self.__width = width
        self.__height = height

    @property
    def area(self):
        return self.__width * self.__height

    @area.deleter
    def area(self):
        print("面积属性已删除。")
        self.__width = 0
        self.__height = 0


# 创建Rectangle类的实例
rectangle = Rectangle(3, 4)
# 访问面积属性
print(rectangle.area)
# 删除面积属性
del rectangle.area
# 再次访问面积属性
print(rectangle.area)

在这个例子中,@area.deleter 装饰器定义了删除 area 属性时要执行的操作。当执行 del rectangle.area 时,会调用该方法,在这里把矩形的宽和高都设为 0。

总结
property 装饰器提供了一种简洁的方式来封装类的属性,通过它可以对属性的访问、设置和删除进行控制,增强代码的安全性和可维护性。同时,它让代码更符合 Python 的面向对象编程风格,使用起来更加直观

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值