python的函数比想象中要丰富很多,尤其是魔法方法,除了我最开始知道的__init__是实例化自动调用,self作为this来使用之外。
还有__new__和参数cls,__new__是对象实例化调用的第一个方法,比__init__还要靠前,而cls则是__new__必须有的参数,表示要实例化的类,只有cls才能将后面的参数传递给__init__,否则后面的__init__操作无法正常进行。
除了这些魔法方法,一个基本的类中包含的魔法方法还有很多,比如在add前后加上__,就变成了__add__,在类中重新定义该方法,就可以将本来的加法改为其他方法。
同时,为了避免进行计算时,前面的值没有需要的方法,还提供了反算术运算符,比如__radd__其实就是在原来的基础上加了r,但是调用的是后者的方法。
把r换成i就变成了增量赋值运算符,替换简单,但是功能却强大。
至于一元运算,属性访问里面的__getattr__,__getattribute__等这些都是一些需要记忆的方法,但是真的去记忆,感觉又大可不必,毕竟想办法重写这些方法,还不如新建一个方法。
新奇的东西往往用处不大,那就说一下应该记忆的东西。
变量的作用域,python虽然有局部变量和全局变量的区别,却可以使用global修改外部作用域的变量,使用nonlocal改变闭包作用域中的变量。
然后是使用lambda关键词来创建匿名函数,可以不写函数名,具体写法是先写lambda,然后写函数的参数,然后是冒号,最后是表达式,可以不写return,因为lambda本身的结果就是返回值。
最后说一下类里面私有属性和公有属性,公有正常定义即可,私有属性需要在变量名前加__,在外部无法直接访问,却可以采用_类名__私有属性变量名的方式获得,所以也就叫伪私有。