面向对象-访问限制

访问限制

1、私有属性

  • 属性类型

    • 公有

      内部外部均可访问

    • 私有

      • 让该属性在类的内部正常访问 不允许外部访问
      • python中私有属性以__作为开头 就成为了私有属性 此刻只能在内部访问使用

      私有属性原因

      类的私有属性可以在一个公有的方法里 去调用和修改值 可以对参数进行验证 避免传入无效参数

  • 私有属性的访问

    • 类的内部

      self.__属性名

    • 类的外部

      外部不建议访问私有属性 因为这样就失去了私有的作用 但是一切都靠自觉 并不会完全限制你

      内部私有属性在存储的时候 将私有属性名转存为 _类名__属性名的方式 所以在外部__属性名 是获取不到的

      对象._类名__属性名 即可

  • 继承

    私有不能被继承

  • 实例

    class Test:
        name = 'lucky'
        __age = 18
    
        def test_private(self):
            print(self.__age)
    
        # 创建公有方法用于修改私有属性的值
        def update_private(self, value):
            # 对于私有属性值进行了判断
            if value > 100 or value < 0:
                print('请输入正确的年龄')
                return
            # 进行修改
            self.__age = value
    
    t = Test()
    # 外部不允许访问私有属性(抛出异常)
    print(t.__age)
    print(t.name)
    
  • 验证私有属性值的存储 _类名__属性名

    class Test:
        name = 'lucky'
        __age = 18
    
        # 创建公有方法用于修改私有属性的值
        def update_private(self, value):
            self.__age = value
            print(self.__dict__)
    
    t = Test()
    t.update_private(20)
    

2、私有方法

  • 概述

    __private_method 以双下划线作为开头 声明该方法为私有方法 只能在类的内部调用和使用 不能再外部调用

  • 注意

    私有不能被继承

  • 私有方法的定义及使用

    class Test:
        def __init__(self, name='lucky'):
            self.name = name
    
        def __say(self):
            print('学习使我开心')
      
        def test_private_method(self):
            self.__say()
    
    t = Test()
    # t.__say()
    t.test_private_method()
    # 外部访问(不建议)
    t._Test__say()
    

3、@property装饰器

  • 概述

    让访问私有属性变成访问公有属性一样的方便 让私有属性可以 对象.属性名 一样去调用

    property装饰器 将方法变成了属性一样的调用

  • 实例

    不适用property装饰器

    class Test:
        __age = 18
    
        def get_age(self):
            print(self.__age)
    
        def set_age(self, value):
            self.__age = value
    
    t = Test()
    t.set_age(20)
    t.get_age()
    

    使用property装饰器

    class Test:
        __age = 18
    
        @property
        def age(self):
            return self.__age
      
        @age.setter
        def age(self, val):
            self.__age = val
    
    t = Test()
    # print(t.age)
    t.age = 20
    print(t.age)
    
posted @ 2022-03-18 14:13  寻月隐君  阅读(34)  评论(0编辑  收藏  举报