欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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操作成功的模拟了隐藏属性的改删查的操作,同时又能够对属性加强控制