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