python的封装

160 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~

封装

面向对象的三大特征:封装 , 继承 , 多态

封装:把功能代码 ,数据封装到某个地方 , 需要的时候进行调用,提高程序的安全性。

即把属性以及方法放到类中,通过类来操作数据或者调用一些功能。

通过封装。可以将一些不想给用户看到的功能可以进行隐藏,用户只能访问我们公开的功能,这样提高了数据的安全性,也对后期的维护降低了维护成本。

进行封装的好处:便于分工,便于复用 , 可扩展性强。

class Dog:
    '''
    类文档
    这个类的说明,这个类的用途 , 大体有什么方法
    '''
    # 类属性
    name = '哈士奇'
    sex = '女'

    def __init__(self , name  , age , weight):
        self.name = name
        self.age = age
        self.weight = weight

    def sleep(self):
        print(f'{self.name}在大门口呼呼睡')

    def eat(self):
        print(f'{self.name}想要吃饭 , 体重{self.weight},过重不让吃')

erha = Dog('二哈',1.5 , 30)
print(erha.name)
print(erha.sex)
# erha.sleep()
# erha.eat()

# print(Dog.__dict__)
# 获取类的类文档内容
# print(Dog.__doc__)

1、属性、方法隐藏

在类中定义了一些数据或者功能不希望被外部访问或者操作的时候,可以将数据或者功能进行隐藏

将属性或者方法名前面加上两个下划线 , 隐藏属性只能在类内部访问

python中没有绝对的隐藏 , 改变一个访问方式就可以进行访问了

class People:

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

    def __eat(self):
        print('狼吞虎咽')

ac = People('阿宸',25)
# print(ac.name)
# # print(ac.__age)
#
# print(ac.__dict__)
#
# # 访问隐藏的属性或者方法
# # 对象名._类名__属性名/方法名
# print(ac._People__age)
# ac._People__eat()


class Bank:

    def __get(self):
        print('取钱')

    def __set(self):
        print('存钱')

    # 通过另一个方法进行访问 , 而不直接访问功能方法
    def money(self):
        self.__get()
        self.__set()

a = Bank()
a.money()

2、属性权限设置

class People:

    def __init__(self , name):
        self.__name = name

    # 可以访问name属性的函数
    def getname(self):
        return self.__name

    # 可以修改name属性的函数
    def setname(self , name):
        self.__name = name


ac = People('阿宸')

print(ac._People__name)
print(ac.getname())
ac.setname('ac')
print(ac.getname())

property()函数

property可以设置、获取、删除对象属性,也可以限制用户对属性的获取(访问)与设置(修改)

property(fget = None , fset = None , fdel = None)

# fget 是获取属性值的方法
# fset 是设置属性值的方法
# fdel 是删除属性值的方法
class A:

    def __init__(self):
        self.name = '阿宸'
        self.__age = 18

    # 获取age属性值的方法
    def get_age(self):
        return self.__age

    # 设置(修改)age属性值
    def set_age(self , value):
        self.__age = value


    # property属性代理
    # 这里的变量名要跟隐藏的属性名一致 , 方便属性使用访问
    age = property(fget=get_age , fset=set_age)

c = A()
print(c.name)
print(c.age)
c.age = 24
print(c.age)

property装饰器

@property是property提供的比较简洁的写法

@property  装饰的方法是获取属性值的方法,被装饰方法的名称会被作为属性名,跟隐藏的属性名一致 , 方便属性使用访问
@属性名.setter 装饰的方法是设置属性值的方法
@属性名.deleter 装饰的方法是删除属性值的方法
class A:

    def __init__(self):
        self.name = '阿宸'
        self.__age = 18

    # 设置访问age属性值的方法
    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self , value):
        self.__age = value

    @age.deleter
    def age(self):
        del self.__age


c = A()
# print(c.age)
# c.age = 24
# print(c.age)
del c.age