python深入之类的补充(3)

关于只读属性

(1)只读属性一般是实例属性,只能读取,不能写入

(2)只读属性只限在内部根据不同情况自动修改,不能在外界随意修改,如电脑的网速,根据宽带实时变化,在外界无法进行修改

关于私有属性的安全性说明

私有属性是通过名称重整机制实现的,所以既然知道这个机制,那么既可以通过其他的手段对私有属性进行外界修改,一般有两种手段,1.直接修改_Animal__a;2.直接使用__dict__方法修改字典存储内容

关于实现只读属性的方法(重点)

(1)方式一,全部隐藏,部分公开,代码如下:

class Person(object):
    def __init__(self):
        self.__age = 18
    def getAge(self):
        return self.__age
p = Person()
print(p.getAge())

即使用属性私有化进行隐藏,使用公开方法进行公开,达到只读目的

(2)property(重点)

概念:作为装饰器,以使用属性的方式来使用某个方法

作用:将读取、写入和删除这三个方法封装,并赋给属性,使用时会将属性与三个方法进行逐一关联,语法是

x = property(getx, setx, delx, "I'm the 'x' property.")

用作装饰器时,可以分开对三个函数进行关联,即@property关联读取,@x.setter关联写入,@x.deleter关联删除。注意,分开关联时,一点要先关联读取,才能关联其他的

经典类:没有继承其他类的类

新式类:继承了其他类的类,需要注意的是,python3中默认类是新式类,python2中默认是经典类,所以建议以后写类是用如下方式:

class Person(object):
    pass

(3)方式一,优化:

class Person(object):
    def __init__(self):
        self.__age = 18
    def setAge(self, value):
        self.__age = value
    def getAge(self):
        return self.__age
    age = property(getAge, setAge)
p = Person()
print(p.age)
p.age = 20
print(p.age)

优化了两个地方:1.避免使用方法的调用,直接使用属性操作的形式;2.没优化之前,在类外使用p.age = 19,是给新增加实例属性的操作,不会报错,结合我们的想法,很容易让人误以为是对私有属性修改成功,进行优化后,则是真正的修改成功,如果不写写入方法,则不可对私有属性进行写入操作

(4)方式二--property装饰

在新式类的作用:

lass Person(object):
    pass
    def __init__(self):
        self.__age = 18
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self, value):
        self.__age = value

p = Person()
print(p.__age)
p.age = 20
print(p.age)

在经典类中的作用:

与在新式类中的区别是,只能关联读取,不能关联其他两个方法

关于常用内置属性

(1)类属性:__dict__类的属性;__bases__类的所有父类构成的元组;__doc__类文档;__name__类名;__module__类定义所在的模块

(2)实例属性:__dict__实例属性;__class__实例对应的类

猜你喜欢

转载自blog.csdn.net/zx870121209/article/details/81324678