• Python基础入门篇【31】--面向对象:类中的私有函数与私有变量


    前言
    作者简介:短尾巴小鳄鱼 ,一位不放弃自己的上进卷妹
    💬 如果文章知识点有错误的地方,请留言指正~和大家一起学习,一起进步
    💬 人生格言:昨日种种,皆成今我。今日种种,方成新我。切莫踌躇,莫停留,莫沉溺💬
    如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦

    python类中的私有函数与私有变量

    类中的私有函数与私有变量

    什么是私有函数与私有变量?

    • 无法被实例化对象调用的类中的函数与变量
    • 类的内部可以调用私有函数与私有变量
    • 定义私有函数与私有变量的目的:只希望类的内部业务调用使用,不希望被使用者调用

    如何定义私有函数与私有变量

    在变量或函数前添加两个__(下划线)

    class Person(object):
        def __init__(self, name):
            self.name = name
            self.__age = 33   # 私有变量
    
        def dump(self):
            print(self.name, self.__age)
            
        def __cry(self):      # 私有函数
            return 'i cant cry'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    例子:

    私有属性无法被实例化对象调用,但可以在类内部被调用:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1eyX9Tnp-1658996687182)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728103019542.png)]

    私有函数无法被实例化对象调用,但可以在类内部被调用:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sb6BhyOD-1658996687184)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728102714188.png)]

    python中的封装

    将不对外的私有属性或方法通过可对外使用的函数而使用(类中定义私有的,只有类内部使用,外部无法访问)

    这样做的主要原因:保护隐私,明确区分内外

    上面举得例子其实已经实现了对私有函数的封装:

    class Cat(object):
        __cat_type = 'cat'  
    
        def __init__(self, name, sex):
            self.name = name
            self.__sex = sex   #
    
        def run(self):
            result = self.__run()  # 在这里调用封装的私有函数
            print(result)
    
        def __run(self):    # 私有函数
            return f'{self.__cat_type},小猫{self.name}{self.__sex}开心的奔跑'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    下面做一个小练习:

    自定义一个交通工具类(Vehicle),并根据提示对该类进行进一步封装,使其拥有工具类型、速度、体积等属性值。通过自定义实例方法实现交通工具的前移、速度设置、获取当前速度、加速行驶、减速行驶、实例信息展示、实例类型判别等功能。

    效果图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Na5YYdl-1658996687185)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728162322764.png)]
    代码参考:

    class Vehicle(object):
        def __init__(self, speed, size, trans_type='SUV'):
            self.new_speed = None
            self.__trans_type = trans_type
            self.speed = speed
            self.size = size
    
        def show_info(self):
            print(f'类型:{self.__trans_type} 速度:{self.speed} 体积:{self.size}')
    
        def move(self):
            print(f'我已向前移动了50米')
    
        def set_speed(self, new_speed):
            self.new_speed = new_speed
    
        def get_speed(self):
            return f'我的时速为:{self.new_speed}'
    
        def speed_up(self):
            self.new_speed_up = self.new_speed + 10
            print(f'我的速度由{self.new_speed}km/h提升到了{self.new_speed_up}km/h')
            self.new_speed += 10
    
        def speed_down(self):
            self.new_speed_down = self.new_speed_up - 15
            print(f'我的速度由{self.new_speed_up}km/h下降到了{self.new_speed_down}km/h')
            self.new_speed_up -= 15
    
        def transport_identify(self):
            if self.__trans_type == 'SUV':
                print('类型匹配')
            else:
                print('类型不匹配')
    
    
    my_car = Vehicle(speed='40km/h', size=(3.6, 1.2, 2))
    my_car.show_info()
    my_car.move()
    my_car.set_speed(new_speed=40)
    print(my_car.get_speed())
    my_car.speed_up()
    my_car.speed_up()
    my_car.speed_up()
    my_car.speed_down()
    my_car.speed_down()
    my_car.transport_identify()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    已分区的硬盘如何重新合并, 分出去的盘怎么重新合并
    [RK3568 Android11]什么是Android EventLog
    Taurus .Net Core 微服务开源框架:Admin 插件【1】 - 微服务节点管理
    齿轮振动信号的数字滤波处理-含Matlab代码
    深度学习之 13 无监督模型
    谷歌云的利润增长才刚刚开始
    Pow(x, n)
    通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新
    [c语言]小课堂 day1
    阿里3年女软件测试工程师心声,当下最好的消息,莫过于我拿到了25K的offer
  • 原文地址:https://blog.csdn.net/weixin_44629511/article/details/126037941