python类,初始化,装饰器和系统变量的总结

2022-08-22 12:36:49
  1. __ file__:显示当前文件所在的位置
    如果当前文件在sys.path里,那么它返回的是相对路径
    如果当前文件不在sys.path里,它返回的是绝对路径
    https://blog.csdn.net/bestallen/article/details/52079847

  2. Init函数
    带两个下划线__开头的函数是声明该属性为私有,不能在类的外部被调用
    Ex:
    在这里插入图片描述

好处:确保了外部代码不能轻易修改对象内部的状态,通过访问限制保护,代码更加健壮
如果外部代码要获取内部变量的方法:定义get函数

在这里插入图片描述
如果又要允许外部代码修改内部变量的方法:定义set函数
在这里插入图片描述

注意:
 带双下划线的开头,并以双下划线结尾的,是特殊变量,特殊变量可以直接访问,不是private变量,故不能用__name__,__score__这样的变量命名
 有些时候会看到一个下划线开头的实例变量名,如_name,这样的实例变量外部是可以访问的,但按约定俗成的规定,当看到这样的变量时,意思是虽然可以被访问,但请把我视为私有变量,不要随意访问

 Init函数支持带参数类的私有化,可声明为该类的属性
 Init函数第一个参数必须为self,后续参数可自由指定,和定义函数没有区别
在一般函数的定义上,可使用def 函数名(参数1,参数2,…)
而在类的内部,def可以为类定义一个方法,但类的方法必须包含参数self,且为第一个参数;另外,**kw定义关键参数,代表任意参数,它定义的是一个字典
https://blog.csdn.net/LY_ysys629/article/details/54893185
https://blog.csdn.net/CLHugh/article/details/75000104

xx:公有变量
_ xx:前置单下划线,私有化属性或方法,一般来讲,变量名_xx被看作是“私有的,在模块或类外不可以使用。当变量是私有的时候,用_xx 来表示变量是很好的习惯。类对象和子类可以访问,这并不能完全做到真正的私有,只是约定俗成的而已,这样写表示不希望这个变量在外部被直接调用
__ xx :前置双下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到,只能是允许这个类本身进行访问了。连子类也不可以)
__ xx __ :前后双下划线,系统定义名字(这就是在python中强大的魔法方法),因为变量名__ xxx __ 对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
xx_:后置单下划线,用于避免与Python关键词的冲突
在这里插入图片描述

https://zhuanlan.zhihu.com/p/53469919

  1. 读取模块中的文档
  1. 使用dir
    它会将对象所有特性(模块的所有函数,类和变量等)列出
    Ex:
    dir(copy)
    由于该命令会将一些以下划线开始,暗示不是为在模块外部使用的特性也列出,故可以使用列表推导式过滤掉
    [n for n in dir(copy) if not n.startswith(‘_’)]

  2. __ all __ 变量
    该变量包含一个列表,这个列表元素和上一步用列表推导式过滤出来的列表元素很类似
    Ex:copy. __ all __
    具体来说,它是在copy模块内部被设置,它其实定义了模块的公有接口,告诉解释器从模块导入所有名字代表什么含义
    Ex:
    From copy import *
    这个命令可以直接使用 __ all __ 变量里的函数;若要使用copy模块中更多的函数,则需要显式地实现
     导入copy然后使用copy.PyStringMap
     使用from copy import PyStringMap
    注意:在使用 __ all __ 非常有用,因为模块中可能会有一堆其他程序不需要地变量,函数和类, __ all __ 可以将其直接过滤出去若没有设定__all__, import *默认会导入模块中所有不以下划线开头地全局名称

  3. 用help及__doc__获取帮助
    Ex:help(copy.copy)
    在这里插入图片描述

进一步用__doc__去看更多内容
Ex:
Print(copy.__ doc __)
在这里插入图片描述

  1. 查看源代码
    通过__file__属性可以直接去读源代码
    Ex: print copy.__ file __
    在这里插入图片描述
  1. 使用@ 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和当前时间计算。

简言之,@装饰器就是在不改变原有函数代码的基础上,动态的扩充函数的功能,即将原有函数被另一个函数包装扩展(添加属性或方法),形成一个包装链;注意执行时依然执行原有函数

两种特殊的装饰器 @classmethod, @staticmethod
@classmethod: 该方法不传入self实例本身,而是传入cls,可以调用类的属性,方法和实例化对象等
ex:

class A(object):
    num= 1

    def func1(self):
        print('func1')

    @classmethod
    def func2(cls):
        print('func2')
        print(cls.num)
        cls().func1()if __name__=='__main__':
    A.func2()

------------------------------>>> func2>>> 1>>> func1

@staticmethod: 此方法不传入类的实例self,且不强制要求传递任何参数,可被类直接调用。
使用时直接在类方法上加上装饰器@staticmethod,参数不需要self,其他参数也是可选,其他模块也可以直接调用该静态方法,换句话说,该方法只是被写在了这个类下面,可以不使用实例化对象而是直接用类来调用这个方法。
ex:

class B(object):

    @staticmethod
    def func1():
        print('func1')

    @staticmethod
    def func2(a, b):
        print('func2')
        print('a=', a)
        print('b=', b)if __name__=='__main__':
    B.func1()
    b= B()
    b.func1()
    B.func2(1, 2)

------------------------------>>> func1>>> func1>>> func2>>> a= 1>>> b= 2
  • 作者:tomwang0322
  • 原文链接:https://blog.csdn.net/weixin_41636030/article/details/109847353
    更新时间:2022-08-22 12:36:49