【拓展】 python3中类的重点与难点:类继承中的私有属性和私有方法

私有属性、方法——Python并没有真正的私有化支持,但可用下划线得到伪私有
尽量避免定义以下划线开头的变量
   (1)_xxx      "单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用'from module import *'导入
   (2)__xxx    类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。)," 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

    (3)__xxx__ 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__() 代表类的构造函数。

class Parent(object):
    # 只有类对象和子类对象可以访问到
    def _xxx(self):
        print('_xxx')

    # 只有类对象自己内部能访问,子类都不能访问
    def __xxx(self):
        print('__xxx')

    # 可以通过公有方法间接的访问
    def xxx(self):
        self._xxx()
        self.__xxx()


p = Parent()
p._xxx()
#p.__xxx() # 会报错:AttributeError: 'Parent' object has no attribute '__xxx'
p.xxx()

# 可以通过此方法实现单下划线的私有属性和方法的访问
p._Parent__xxx()

# 打印出类对象的所有方法
print(dir(p))

python实例可以直接调用Python的公有方法;私有方法和属性在外部不可以直接用属性或方法名调用,内部将私有方法和属性在前面增加了  "_类名"

_xxx
_xxx
__xxx
__xxx
['_Parent__xxx', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_xxx', 'xxx']
  • 私有的属性,不能通过对象直接访问,但是可以通过方法访问
  • 私有的方法,不能通过对象直接访问
  • 私有的属性、方法,不会被子类继承,也不能被访问
  • 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
  • 可以通过调用继承的父类的共有方法,间接的访问父类的私有方法、属性

猜你喜欢

转载自blog.csdn.net/qq_41020281/article/details/80198819