Python面向对象三大特征
面向对象的三大特征:封装,继承和多态
一、封装
- 广义的封装:函数的定义和类的定义
- 狭义的封装:一个类中的某些属性,如果不希望被外界直接访问,则可以将该属性私有化,该属性只能在当前类中被直接访问;如果在类的外面需要访问(即获取或修改),则可以通过暴露给外界的函数间接访问
- 封装的本质:将类中的属性进行私有化
1.1 私有属性
以实例属性为例,类属性一样,私有化只要在类属性前面添加两个下划线
_
,
-
公有属性
正常使用
self.变量 = 值
定义,可以在类的外面直接用对象进行访问到
# 定义类
class Person1():
def __init__(self, name, age):
# 公开属性
self.name = name
self.age = age
# 创建对象
p1 = Person1("张三", 10)
# 通过对象可以直接访问
print(p1.name, p1.age)
-
私有属性
在定义属性的时候,在前面添加两个下划线
_
,如上诉的name
修改为__name
- 注意
- 此时变量名为
__name
,而不是原来的name
- 进行限制属性动态绑定的时候,也要书写
__xxx
形式 - 在当前类中的函数中,可以通过
self.__xxxx
访问 - 类的外面直接用对象无法访问到
- 此时变量名为
- 注意
# b.私有属性/属性的私有化
class Person2():
# 注意事项:哪怕是定义了私有属性,进行了限制属性动态绑定的时候,也要书写__xxx形式
__slots__ = ("__name", "__age")
def __init__(self, name, age):
# 私有属性,只需要在属性名的前面添加两个下划线__
self.__name = name
self.__age = age
# 注意3:在当前类中的函数中,可以self.__xxx访问的
def show(self):
print(f"姓名:{
self.__name},年龄:{
self.__age}")
# 创建对象,通过对象可以直接访问
p2 = Person2("张三", 10)
# 通过对象无法直接访问
# print(p2.__name, p2.__age) # 报错:AttributeError: 'Person2' object has no attribute 'name'
p2.show(