• Python面向对象之私有属性和私有方法


    1、 应用场景及定义方式

    ①应用场景

      在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到

      私有属性 就是 对象 不希望公开的 属性

      私有方法 就是 对象 不希望公开的 方法

    ②定义方式

      在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法

      

    class Women:
    
        def __init__(self, name):
            self.name = name
            # 不要问女人的年龄
            self.__age = 18
    
        def __secret(self):
            print("我的年龄是%d" % self.__age)
    
    
    a = Women('Alice')
    print(a)
    
    # # 私有属性,外部不能直接访问
    # a.__age
    # 私有方法, 外部不能直接访问
    # a.__secret()

    02. 伪私有属性和私有方法(科普)

    提示:在日常开发中,不要使用这种方式访问对象的 私有属性 或 私有方法

    Python 中,并没有 真正意义 的 私有

      在给 属性方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到

      处理方式:在 名称 前面加上 _类名 => _类名__名称

    print(a._Women__age)   >> 18 # 私有属性外部不能直接访问
    print(a._Women__secret())  >> 我的年龄是18  # 私有方法外部不能直接访问

     03.get函数和set函数

    解决外部访问私有属性问题

    get函数和set函数为自定义函数,为了和封装概念吻合,命名为getXXX和setXXX

    get函数:获取值

    set函数:设置值【赋值,传值】

    说明:本质都是一个普通成员函数,get函数一般有返回值,set设置参数

    class Women:
    
        def __init__(self, name):
            self.name = name
            # 不要问女人的年龄
            self.__age = 18
    
        def setAge(self):
            self.__age = 18
    
        def getAge(self):
            return self.__age
    
        def __secret(self):
            print("我的年龄是%d" % self.__age)
    
    
    a = Women('Alice')
    print(a.getAge())   >> 18

    04.@property装饰器

    装饰器:给函数动态的添加功能,对于类的成员方法也可以使用装饰器

    @property装饰器:将一个函数当做变量使用,简化get和set函数

    使用:@property装饰器作用于一个函数,相当于get函数

    ​ 与此同时会生成一个新的装饰器@属性名.setter,相当于set函数用于赋值

    注意:@property装饰器只能使用在类中的成员方法中,简化代码,同时保证对参数进行校验

    class Person:
        def __init__(self, name, age):
            self.__name = name
            self.__age = age
    
        # 注意:函数的命名方式,get函数,
        # 函数的命名并不是固定的,只要是一个合法的标识符即可,
        # 但是,一般情况下,使用变量名命名,方便区分
        @property
        def name(self):
            return self.__name
    
        # 注意:函数命名方式:和@property作用的函数名保持一致,
        # 装饰器的命名方式:@属性名.setter
        # 相当于是set函数,设置参数,给私有化属性进行赋值
        @name.setter
        def name(self, name):
            self.__name = name
    
        @property
        def age(self):
             return self.__age
    
        @age.setter
        def age(self, age):
            if age < 0:
                age = 0
            self.__age = age
    p1 = Person("jack", 15)
    print(p1.name)     #>>jack
    p1.name = 'tom'
    print(p1.name)     #>>tom
  • 相关阅读:
    《无垠的太空(9).利维坦陨落》第三十六章:吉姆
    早起
    《无垠的太空(9).利维坦陨落》第四十章:奈奥米
    《无垠的太空(9).利维坦陨落》第三十五章:亚历克斯
    《无垠的太空(9).利维坦陨落》第三十九章:吉姆
    为什么我没喜欢上游戏
    《无垠的太空(9).利维坦陨落》第四十一章:吉姆
    《无垠的太空(9).利维坦陨落》第三十八章:艾薇
    《无垠的太空(9).利维坦陨落》第三十七章:田中
    pytest单个用例多次运行重跑
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/11286339.html
Copyright © 2020-2023  润新知