python类,初始化,装饰器和系统变量的总结
-
__ file__:显示当前文件所在的位置
如果当前文件在sys.path里,那么它返回的是相对路径
如果当前文件不在sys.path里,它返回的是绝对路径
https://blog.****.net/bestallen/article/details/52079847 -
Init函数
带两个下划线__开头的函数是声明该属性为私有,不能在类的外部被调用
Ex:
好处:确保了外部代码不能轻易修改对象内部的状态,通过访问限制保护,代码更加健壮
如果外部代码要获取内部变量的方法:定义get函数
如果又要允许外部代码修改内部变量的方法:定义set函数
注意:
带双下划线的开头,并以双下划线结尾的,是特殊变量,特殊变量可以直接访问,不是private变量,故不能用__name__,__score__这样的变量命名
有些时候会看到一个下划线开头的实例变量名,如_name,这样的实例变量外部是可以访问的,但按约定俗成的规定,当看到这样的变量时,意思是虽然可以被访问,但请把我视为私有变量,不要随意访问
Init函数支持带参数类的私有化,可声明为该类的属性
Init函数第一个参数必须为self,后续参数可自由指定,和定义函数没有区别
在一般函数的定义上,可使用def 函数名(参数1,参数2,…)
而在类的内部,def可以为类定义一个方法,但类的方法必须包含参数self,且为第一个参数;另外,**kw定义关键参数,代表任意参数,它定义的是一个字典
https://blog.****.net/LY_ysys629/article/details/54893185
https://blog.****.net/CLHugh/article/details/75000104
xx:公有变量
_ xx:前置单下划线,私有化属性或方法,一般来讲,变量名_xx被看作是“私有的,在模块或类外不可以使用。当变量是私有的时候,用_xx 来表示变量是很好的习惯。类对象和子类可以访问,这并不能完全做到真正的私有,只是约定俗成的而已,这样写表示不希望这个变量在外部被直接调用
__ xx :前置双下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到,只能是允许这个类本身进行访问了。连子类也不可以)
__ xx __ :前后双下划线,系统定义名字(这就是在python中强大的魔法方法),因为变量名__ xxx __ 对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
xx_:后置单下划线,用于避免与Python关键词的冲突
https://zhuanlan.zhihu.com/p/53469919
- 读取模块中的文档
-
使用dir
它会将对象所有特性(模块的所有函数,类和变量等)列出
Ex:
dir(copy)
由于该命令会将一些以下划线开始,暗示不是为在模块外部使用的特性也列出,故可以使用列表推导式过滤掉
[n for n in dir(copy) if not n.startswith(‘_’)] -
__ all __ 变量
该变量包含一个列表,这个列表元素和上一步用列表推导式过滤出来的列表元素很类似
Ex:copy. __ all __
具体来说,它是在copy模块内部被设置,它其实定义了模块的公有接口,告诉解释器从模块导入所有名字代表什么含义
Ex:
From copy import *
这个命令可以直接使用 __ all __ 变量里的函数;若要使用copy模块中更多的函数,则需要显式地实现
导入copy然后使用copy.PyStringMap
使用from copy import PyStringMap
注意:在使用 __ all __ 非常有用,因为模块中可能会有一堆其他程序不需要地变量,函数和类, __ all __ 可以将其直接过滤出去,若没有设定__all__, import *默认会导入模块中所有不以下划线开头地全局名称 -
用help及__doc__获取帮助
Ex:help(copy.copy)
进一步用__doc__去看更多内容
Ex:
Print(copy.__ doc __)
- 查看源代码
通过__file__属性可以直接去读源代码
Ex: print copy.__ file __
- 使用@ property装饰器
在绑定属性时,若将属性直接暴露,虽然方便,但无法检查参数,导致可随意改成绩,因此
Ex:
故我们可以用简单的set和get方法实现,并在set上限定取值范围
Ex:
这样通过set限定了score的取值范围
由于上述调用方法比较复杂,没有直接调用属性这么简单。故使用python内置的@property装饰器可以既能检查参数,又能用类似属性的方式来访问类的变量。
这里,原先的getter方法通过@property就变成了属性,而 @property本身又创建了另一个装饰器@score.setter,可以把setter方法变成属性赋值;这样利用@property就可以替代getter和setter的作用。
另外,@property还可以只定义getter方法,而不定义setter方法就是一个只读属性
这里的birth就是可读写属性,而age就是只读属性,因为age可根据birth和当前时间计算。
简言之,@装饰器就是将类的方法变成了类的一个属性;方法可以理解为后天可练习获得,而属性是先天就有的,即是这个类与其他类本质不同之处。