python深入之类的补充(2)

关于属性的访问权限

(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内建属性

猜你喜欢

转载自blog.csdn.net/zx870121209/article/details/81324069
今日推荐