关于属性的访问权限
(1)属性的访问区域可以分为四个,分别是类内部、衍生类内部,模块内除类以外的空间和模块外,模块外访问又有两种导入形式,即import 模块 形式和from 模块 import *形式,两种导入形式存在差异,即使用后者时需要在原模块中使用__all__属性说明哪些变量是可以在其他模块中导入的,如__all__ = ["_a"]
(2)python中没有真正的私有化支持,即不像Java中有public和private两种属性,但python中可以使用下划线来使属性私有化,其中a表示公开属性,_a表示受保护属性,__a表示私有属性
(3)利用如下代码实现各种属性访问权限的检查
class Animal: __m = 10 def test(self): print(Animal.__m) print(self.__m) # pass class Dog(Animal): def test1(self): print(Dog.__m) print(self.__m) print(Animal.__dict__) print(Dog.__dict__) a = Animal() d = Dog() # 类内部 a.test() # 衍生类 d.test1() # 模块内 print(a._m) print(Animal._m) # 其他模块 m = 10
其中,公开属性访问区域是四个区域;受保护属性访问区域是类和其子类内部,其他地方也可以访问,但会提示属性受保护;私有属性访问区域只有类内部
关于私有属性的实现机制(重点)
(1)python中私有是伪私有,即不是真正的私有,这里使用的是名称重整机制,将__a重整名称为_Animal__a,这样再次访问__a时就会报错
(2)这种机制的目的有二:1.防止私有属性被外界访问;2.防止子类中同名属性的覆盖
关于私有属性的应用场景--保护和过滤
(1)代码如下:
class Person: age = 18 def setAge(self, value): if isinstance(value, int) and 0 < value < 200: self.age = value else: print("输入有误,请重新输入") def getAge(self): return self.age pass p1 = Person() p1.setAge(223) print(p1.getAge()) p2 = Person() p2.setAge(22) print(p2.getAge())
由于私有属性无法在外界操作,所以在类中进行添加操作方法,对私有属性进行返回即可
(2)初始化方法(重点):
class Person(object): def __init__(self): self.__age = 18
初始化方法的作用是,一旦使用类创建实例,实例就会被初始化,即拥有初始化的属性,如p = Person()后,p实例就拥有p.__age = 18属性
关于关于变量加下划线的规范
(1)_a表示受保护属性,a_表示一个普通属性,这样做是为了区分变量名和关键字,如class关键字和class_属性
(2)__a表示私有属性,__a__表示python内建属性