python面向对象(访问控制:public,protected,private)

python面向对象3

面向对象(访问权限)

  • 与 C++、C#、Java 等语言相似,Python 支持将类的属性和方法设置成特定的访问权限,但不是通过关键字区分,而是使用一套约定式的规则
  • 属性或方法为公有(public)属性或方法,可在类的外部直接访问,在类内部以“self.属性名或方法名”的方式使用
  • 在Python中可以通过在变量属性以及方法属性是否有下划线“_”进行区分public、protected、private类型

public(没有下划线)

在python中数据和方法默认都是public类型的,此时方法和变量名都没有下划线

  • xx 没有以下划线开头的变量或者方法是public类型
访问控制
  • public类型可以被本类内,子类以及类外被访问
    • 本类内
    • 子类内
    • 类外

protected(一个下划线)

  • _xx 以单下划线开头表示的是protected类型的变量或者方法
访问控制
  • protected类型只能允许其本身与子类进行访问
    • 本类内
    • 子类内

private(两个下划线)

  • __xx 双下划线表示的是私有类型的变量或者方法
访问控制
  • private类型只能允许本类内进行访问
    • 本类内

其他说明

  1. __xx__定义的是类专有方法(魔术方法),这些是python内部定义的变量名

  2. python没有严格意义上的private类型

    • 若方法或者变量是private类型时,其方法或者变量实际上是被转换了
      • 转换规则是 在变量的前端插入类名,再类名前添加一个一个下划线_,使用对象名._类名__私有方法名(实参类表)调用private方法,使用对象名._类名__私有属性名访问private属性
    class MyClass(object):
        def __init__(self):
            # public
            self.name = "MyClass" #非私有实例属性public
            # protected
            self._sex = "man" #似protected实例属性
            # private
            self.__age = 10 #私有实例属性
    
        def method_publicted(self): #一般类方法 public
            print("call public function")
    
        def _method_protected(self):  # 似protected方法
            print("call protected function")
    
        def __method_private(self): #私有类方法 private
            print("call private function")
    
        def call_method_inClass(self):#类内访问public,protected,private方法
            self.method_publicted()
            self._method_protected()
            self.__method_private()
            return
    
    obj = MyClass()
    
    # 调用方法
    print('调用call_method_inClass方法')
    obj.call_method_inClass()
    
    print('类外直接访问public,protected,private方法')
    obj.method_publicted()  #类外直接访问public方法,ok
    obj._method_protected() #类外直接访问protected方法,ok;但是编辑器没有主动提示
    # obj.__method_private()#类外不允许直接访问private方法,抛异常
    
    print('类外通过 对象名._类名__私有方法名(实参类表) 访问private方法')
    obj._MyClass__method_private() #ok
    
    # 访问属性
    print(obj.name) #类外直接访问public实例属性,ok
    print(obj._sex)#类外直接访问protected方法,ok;但是编辑器没有主动提示
    # print(obj.__age) #类外不允许直接访问private方法,抛异常
    print('类外通过 对象名._类名__私有实例属性名 访问private实例属性')
    print(obj._MyClass__age)
    
    # 结果
    调用call_method_inClass方法
    call public function
    call protected function
    call private function
    类外直接访问public,protected,private方法
    call public function
    call protected function
    类外通过 对象名._类名__私有方法名(实参类表) 访问private方法
    call private function
    MyClass
    man
    类外通过 对象名._类名__私有实例属性名 访问private实例属性
    10
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值