python面向对象三大特性:封装、继承、多态
程序员文章站
2022-06-11 22:29:50
...
一:封装
1.封装的概念
我们将相似的代码定义在类中就是一种封装,封装分为两步,隐藏和开放接口。我们可以对类中的代码严格的控制对他的访问。
2.隐藏属性
pythona在类中采取双下划线开头的方式定义一个隐藏的属性和隐藏的函数,本质上是一种变形操作将变量名变为_类名__变量名,并且会在函数的定义阶段和检查语法阶段进行变形,类在定义是就会执行,而函数会在被加()时被调用。
总结:
1.python中对变量名前加__方法设置隐藏
2.仅仅是一种变形操作 ==> _类名__变量名
3.会在定义阶段和检查语法时进行变形
4.隐藏对外不对内,对内仍然可以采用__变量名的方法调用
5.变形操作值在定义阶段变形一次,后面执行的代码不能够对其变形
class People:
__say = '1'
def __init__(self,name):
self.name = name
def say1(self):
pass
print(People.__dict__)
# '_People__say': '1'
后续不变形
class People:
__say = '1'
def __init__(self,name):
self.name = name
def say1(self):
pass
print(People.__dict__)
# '_People__say': '1'
People.__transform = 'sb'
print(People.__dict__)
# '__transform': 'sb'
三.开放接口
3.1 隐藏属性
就像存储数据一样,隐藏不是目的,取才是目的,我们可以通过添加额外的逻辑来控制用户对属性的调用,如下
class People:
__age = 18
def __init__(self,name):
self.name = name
def age(self):
self.__age # 即便是通过类对象访问,也可以访问到类中的属性
注:即使是在内部定义函数通过对象访问也可以访问得到
3.2 隐藏功能
通过隐藏不仅可以严格控制外部对类内部的访问,同时也可以隔离复杂度,让使用者能够简单的使用类方法
class People:
__age = 18
def __init__(self, name):
self.name = name
# 1.输密码
def __input(self):
pass
# 2.取现
def __draw(self):
pass
def all(self):
self.__input()
self.__draw()
p = People('alex')
p.all()
四 property方法
我们通过开放一个函数接口来让用户访问类中的隐藏属性,但是我们调用时却不像是在调用属性,为了让我们看起来是在调用属性,我们通过property的装饰器方法可以通过调用属性的方式调用函数
# class People:
# __say = '1'
# def __init__(self,name):
# self.name = name
# def say1(self):
# pass
#
# print(People.__dict__)
# # '_People__say': '1'
#
# People.__transform = 'sb'
# print(People.__dict__)
# # '__transform': 'sb'
class People:
__age = 18
def __init__(self, name):
self.name = name
@property
def age(self):
return self.__age
# 1.输密码
def __input(self):
pass
# 2.取现
def __draw(self):
pass
def all(self):
self.__input()
self.__draw()
p = People('alex')
print(p.age)
除了property方法外,property在内部还提供了改和删除操作
property.deleter # 删除
property.setter # 改
但三者定义的函数名必须相同
class People:
__name = 'star'
@property # 查看操作,只能够对查看操作使用此
def name(self):
return self.__name
@name.setter # 改操作
def name(self,user):
self.__name = user
@name.deleter # 删除操作
def name(self):
raise ValueError('不让删除')
p = People()
# del p.name 触发@name.deleter下的操作
p.name = 'egon' # 触发@name下的setter操作
print(p.name) # 触发property下的查看操作
到此:property操作成功的模拟了隐藏属性的改删查的操作,同时又能够对属性加强控制
下一篇: python基础学习1