私有化
- xx: 公有变量
- _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
- __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
- __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:
__init__
, __ 不要自己发明这样的名字 - xx_:单后置下划线,用于避免与Python关键词的冲突
通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。
1 class Person(object): 2 def __init__(self, name, age, taste): 3 self.name = name 4 self._age = age 5 self.__taste = taste 6 7 def showperson(self): 8 print(self.name) 9 print(self._age) 10 print(self.__taste) 11 12 def dowork(self): 13 self._work() 14 self.__away() 15 16 17 def _work(self): 18 print('my _work') 19 20 def __away(self): 21 print('my __away') 22 23 class Student(Person): 24 def construction(self, name, age, taste): 25 self.name = name 26 self._age = age 27 self.__taste = taste 28 29 def showstudent(self): 30 print(self.name) 31 print(self._age) 32 print(self.__taste) 33 34 @staticmethod 35 def testbug(): 36 _Bug.showbug() 37 38 # 模块内可以访问,当from cur_module import *时,不导入 39 class _Bug(object): 40 @staticmethod 41 def showbug(): 42 print("showbug") 43 44 s1 = Student('jack', 25, 'football') 45 s1.showperson() 46 print('*'*20) 47 48 # 无法访问__taste,导致报错 49 # s1.showstudent() 50 s1.construction('rose', 30, 'basketball') 51 s1.showperson() 52 print('*'*20) 53 54 s1.showstudent() 55 print('*'*20) 56 57 Student.testbug()
总结
- 父类中属性名为
__名字
的,子类不继承,子类不能访问 - 如果在子类中向
__名字
赋值,那么会在子类中定义的一个与父类相同名字的属性 _名
的变量、函数、类在使用from xxx import *
时都不会被导入
附加:修改、查看私有属性、名字重整:
python中的私有属性是通过名字重整操作的,即私有属性名前加上_类名
查看私有属性:_类名__私有属性名(除两个下划线)
通过实例对象.__私有属性名(除两个下划线)=值 只是将实例对象添加了一个属性(既不是私有属性,也不是实例属性)而已,不会修改到私有属性。