文章目录

  • python面向对象3
  • 面向对象(访问权限)
  • 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