python里面其实有一些很方便强大的工具,但是可能一般其他语言里没有对应的东西。导致很多其他语言转python的,或者python新手都不知道这些东西,甚至有时候一些对python比较了解的开发者也并不知道这些。下面给大家介绍一下python里面有强大魔力的几个东西。
魔术方法(Magic Method)
python里的魔术方法类似于某些语言开发应用的时候使用的,回调或者叫钩子。原理其实也简单,就是python预定义了很多方法,在不同的情况下执行这些方法,你可以自己定义相应的方法覆盖默认方法,这样在对应的情况下会执行你自己定义的方法。
比如我们常用dir来查看对象里的成员:
可以看到,默认dir返回的是对象所有成员,但定义__dir__方法之后,dir返回的是我们定义的__dir__返回的内容。这就是因为dir在调用的时候,默认会优先调用对象的__dir__方法,如果没有再返回对象可用属性。
python里面预定义的魔术方法很多,下面列出常用的魔术方法:
__init__ 类实例初始化的时候触发__del__ 对象被清理的时候触发__repr__ print的时候调用__str___ str()的时候调用__getattr__(self, name) 访问对象不存在属性时候触发__getattribute__(self, name) 同上,但优先于__getattr__触发__setattr__(self, name, value) 设置对象属性的时候触发,注意和__getattr__不一样__delattr__(self, name) 删除对象属性的时候触发 下面就是喜闻乐见的操作符重载的系列方法,不一一注释了__add__(self, other)__sub__(self, other)__mul__(self, other)__matmul__(self, other)__truediv__(self, other)__floordiv__(self, other)__mod__(self, other)__divmod__(self, other)__pow__(self, other[, modulo])__lshift__(self, other)__rshift__(self, other)__and__(self, other)__xor__(self, other)__or__(self, other)__lt__(self, other)__le__(self, other)__eq__(self, other)__ne__(self, other)__gt__(self, other)__ge__(self, other)
元编程(Meta programming)
python的优越性之一,就在于元编程了。元编程是什么呢?其他语言开发者可能接触比较少,元编程就是可以在编程中操作类或者对象本身。简单说,就是可以动态生成类或者类方法的一种编程方式。
主要有下面几种形式
- 动态生成类
假设你需要实现一个orm,有一个奇特的需求,根据表结构动态生成一个类。这在很多语言里是基本无法实现的,但是python里恰好有这种魔法。
记得我们常用的type方法么?就是用来查看对象类型的那个,这个方法同时也可以用来构造类,实际上,python里定义新类,用的就是type方法。牢记一点,在python里,类也是一种对象,当然可以动态创建了。
可以看到,属性列表里,方法的第一个参数就是类实例本身,这也解释了为啥我们定义类方法的时候,第一个都是self。
- 动态添加类方法
python里动态增加类方法还是很简单的。使用内置的setattr方法,可以设置一个方法成为类属性。当然最简单的是直接用属性赋值的方式也一样可以。
或者定义T方法的__getattr__方法也可以实现自定义方法,但是这种方式无法在类属性里看到这些属性。
- 修饰器
修饰器应该是python里非常常见的方法了,和设计模式里的修饰器模式有点类似。简言之就是定义类或者方法的时候,加上修饰器之后,实际定义的类或者方法,会是以定义的类或者方法调用修饰器方法后返回的类或者方法。
举个例子
可以看到,定义的类本来是X,因为使用的修饰器返回的是我们之前定义的T,所以实际定义的X就是T。
好了,python最具有魔力的几个部分基本介绍了一下,不知道大家勇敢没有。如果之前没用过的同学,不妨试着用一下,这些强大的工具会让你的代码更简洁强大。