概念
意义:
注意:在python中并没有真正的私有化支持。但是,可以使用下划线完成伪私有化的效果。类属性(方法)和实例属性(方法)遵循相同的规则。
x:公有属性:√类内部访问、√子类内部访问、模块内其他位置访问(类访问(√父类、√派生类)。实例访问(√父类实例、√派生类实例))、夸模块访问(√import形式导入、√from 模块 import * 形式导入)
# class Animal: # x = 10 # def test(self): # print(Animal.x) # print(self.x) # pass # # class Dog(Animal): # def test2(self): # print(Dog.x) # print(self.x) # pass # # # # 测试代码 # A = Animal() # # A.test() # # # D = Dog() # # D.test2() # # print(Animal.x) # print(Dog.x) # print(A.x) # print(D.x) a = 100
_y:受保护的属性:√类内部访问、√子类内部访问、模块内其他位置访问(类访问(!父类、!派生类)。实例访问(!父类实例、!派生类实例)会有警告提示。)、夸模块访问(import形式导入(会有警告提示)、from 模块 import * 形式导入(√有__all__指明对应变量。×没有__all__指明对应变量。会直接报错。无法调用))
class Animal: _x = 10 def test(self): print(Animal._x) print(self._x) pass class Dog(Animal): def test2(self): print(Dog._x) print(self._x) pass # 测试代码 A = Animal() # A.test() # # D = Dog() # D.test2() print(Animal._x) print(Dog._x) print(A._x) print(D._x) # __all__ = ["_a"] _a = 100
__z:私有化属性:√类内部访问、×子类内部访问、模块内其他位置访问(类访问(×父类、×派生类)。实例访问(×父类实例、×派生类实例)会有警告提示。)、夸模块访问:参照_y单下划线开头变量的访问原则。
class Animal: __x = 10 def test(self): print(Animal.__x) print(self.__x) pass class Dog(Animal): def test2(self): print(Dog.__x) print(self.__x) pass # 测试代码 A = Animal() # A.test() D = Dog() # D.test2() print(Animal.__x) print(Dog.__x) print(A.__x) print(D.__x) __all__ = ["_a"] __a = 100私有属性的实现机制:名字重整机制(Name Mangling)->重改__x为另外一个名称,如:_类名__x。目的:防止外界直接访问。防止被子类同名称属性覆盖。
补充:
四个访问区域: