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 的面向对象编程风格,使用起来更加直观