关于只读属性
(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__实例对应的类