python getattr_python的魔法秘技你知道几个?

f0224c1b7f88b92775beade63d226ec3.png

python里面其实有一些很方便强大的工具,但是可能一般其他语言里没有对应的东西。导致很多其他语言转python的,或者python新手都不知道这些东西,甚至有时候一些对python比较了解的开发者也并不知道这些。下面给大家介绍一下python里面有强大魔力的几个东西。

魔术方法(Magic Method)

python里的魔术方法类似于某些语言开发应用的时候使用的,回调或者叫钩子。原理其实也简单,就是python预定义了很多方法,在不同的情况下执行这些方法,你可以自己定义相应的方法覆盖默认方法,这样在对应的情况下会执行你自己定义的方法。

比如我们常用dir来查看对象里的成员:

b1218cb06205b28561de017762f82145.png

可以看到,默认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里,类也是一种对象,当然可以动态创建了。

a589bbe8e8a8f93bf9758f24555892f8.png

可以看到,属性列表里,方法的第一个参数就是类实例本身,这也解释了为啥我们定义类方法的时候,第一个都是self。

  • 动态添加类方法

python里动态增加类方法还是很简单的。使用内置的setattr方法,可以设置一个方法成为类属性。当然最简单的是直接用属性赋值的方式也一样可以。

c43ba366f15941749cc311a70eb43bed.png

或者定义T方法的__getattr__方法也可以实现自定义方法,但是这种方式无法在类属性里看到这些属性。

  • 修饰器

修饰器应该是python里非常常见的方法了,和设计模式里的修饰器模式有点类似。简言之就是定义类或者方法的时候,加上修饰器之后,实际定义的类或者方法,会是以定义的类或者方法调用修饰器方法后返回的类或者方法。

举个例子

8340efb5f1cc227fc0a597acfd4c57a7.png

可以看到,定义的类本来是X,因为使用的修饰器返回的是我们之前定义的T,所以实际定义的X就是T。

好了,python最具有魔力的几个部分基本介绍了一下,不知道大家勇敢没有。如果之前没用过的同学,不妨试着用一下,这些强大的工具会让你的代码更简洁强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值