来点野东西(冷知识,入坑必备,内附猴子补丁)
总所周知,python好学,但是,里面的坑能让你怀疑人生。
来个前戏热热身:
def foo(a=[]):a.append(1)return afoo()
print(foo())
打印结果:
[1, 1]
内心独白:我干什么了?!我这是调用了两次函数而已,我,传统美德
如果不想做死,我建议大家这样写:
def foo(a=None):if not a:a=[]a.append(1)return afoo()
print(foo())
打印结果:
[1]
python的确很随意(因为是弱类型的语言嘛),随心所欲将可变对象作默认参数传递也太随便了吧,千万不要以为python是条蛇就能随意摆弄,它可是条蟒蛇,这只是入门级的坑而已。
下面来点高级一点的:
class A(object):def __call__(self, *args, **kwargs):return 'from A.__call__'a = A()
print(a())
打印结果:
from A.__call__
这是大家熟悉并且理解的,但是:
class A(object):def __call__(self, *args, **kwargs):return 'from A.__call__'a = A()
print(a())
a.__call__ = lambda :'from lambda'
print(a())
打印结果:
from A.__call__
from A.__call__
这是大家能理解的,但是我再改改
class A(object):passa = A()
a.__call__ = lambda :'from lambda'
print(a.__call__())
打印结果:
from lambda
结果也是正常,给对象加个方法而已再调用嘛。(python中的猴子补丁)
下面来点不正常的,请睁大眼睛找不同!!!!!!!!
class A(object):def foo(self,x):return 'from A.foo'a = A()
a.foo = lambda :'from a.foo'
print(a.foo())
打印结果:
from a.foo
请注意,类和对象的变量空间里都有foo,但是这里是从对象的变量空间里来的。
在这里说明一下,在 Python 中,新式类( new class \ )的内建特殊方法,和实例的属性字典是相互隔离的,具体可以看看 Python 官方文档对于这一情况的说明:
For new - style classes , implicit invocations of special methods are only guaranteed to work correctly if defined on an object ' s type , not in the object ' s instance dictionary. That behaviour is the reason why the following code raises an exception \ ( unlike the equivalent example with old - style classes\ ):
一般情况下是,优先从对象的变量空间里找,再从类,父类(注意顺序)里找。
再耐心的看看下面这个情况:
class A(object):def __call__(self, *args, **kwargs):return 'from A.__call__'a = A()
a.__call__ = lambda :'from lambda'
print(a())
打印结果:
from A.__call__
这里是从类的变量空间里来的。
一次是优先从对象的变量空间里来的,一次是从对象的变量空间里来的(注意:此处没有“优先”)。
下面我们来仔细分析分析这个原因,当用对象()调用时,是无法调用a.__call__的。也就是说python里的特殊方法,你不能瞎改,属性和一般的方法你可以动,但是特殊方法得按python的规矩来。
在此我不得不向大佬致敬(传统美德)。python是支持先上车再补票的,但是特殊位子,不好意思,得按python的意愿。
再出个题给大家玩一玩:
用一行代码实现:a(1)(2) --> 1+2
答案:
a = lambda x :lambda y:x+y
来点野东西(冷知识,入坑必备,内附猴子补丁)相关推荐
- 肝货满满!CV学习笔记:入坑必备
知乎:云时之间 链接:https://zhuanlan.zhihu.com/p/102044405 编辑:王萌 作者的话 最近因为一些原因被安排去做关于目标跟踪的一些工作,对我来说可谓是一个很大的挑战 ...
- 常见web漏洞验证攻略(萌新入坑必备!)
常见web漏洞验证攻略(萌新入坑必备 首先,祝大家愚人节快乐,玩笑有度,"愚"人同乐. 其次,回想当年刚入坑的时候了解的比较少,也没人带,一般过去就是xss,后来xss的防护了,就 ...
- 「星辰大海」你可能需要知道的 promise 知识的总结(内附思维导图)
前言 接上一期 「高频面试题」女友:消息队列 和 事件循环系统终于弄明白了!(内附思维导图) 文章出炉后,微信好友也多了不少,还挺好的~ 最近又重新整理一下 Promise 相关知识,一方面和上一期文 ...
- python file does not exist什么意思_Python的冷知识和坑
声明 此文章为个人翻译,原文出自:码农周刊. 除非特殊说明,以下代码皆为Python3.4. 译文 Python使用C3算法解决多重继承问题. 根据C3算法,以下代码在处理多重继承的时候,会在clas ...
- find linux 指定后缀_Linux终端命令入坑必备知识与技巧
才接触Linux系统,一些概念简直是一头雾水,那么本文的目的就是在Linux中使用终端输入命令时,常见的一些概念及技巧. 1 什么是主目录(home directory)?Linux是一个典型的多用户 ...
- 一个例子入坑布谷鸟算法(附完整py代码)
布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由 布谷鸟算法思想简介 更新位置的方式 莱维飞行 局部随机行走 抛出个 ...
- python dataframe groupby_【Python数据分析基础】入坑必备的数据预处理操作
本文解决的是2类目标业务: 有数据不知道怎么做数据分析操作的. 自己有思路不知道怎么落地实现的. Python数据分析基础必用品 office软件(推荐2016版) Python开发环境(推荐Anac ...
- 【华为云技术分享】敏捷DevOps知识卡大全(内附下载资料)
如果您曾经对敏捷或DevOps的结构.知识有过疑问,那么您将在[敏捷智库]里找到答案,本文将为大家带来用户故事拆分.DevOps转型闭坑指南的精彩内容. 知识卡每周持续更新,请收藏关注~ 如果您想在知 ...
- linux使用TC并借助ifb实现入向限速(内附配置实例)
ifb的原理概述 和tun一样,ifb也是一个虚拟网卡,和tun一样,ifb也是在数据包来自的地方和去往的地方做文章.对于tun而言,数据包在xmit中发往字符设备,而从字符设备写下来的数据包则在tu ...
最新文章
- JEECMS站群管理系统-- Jeecms项目导入myeclipse
- matlab中repmat的用法,Matlab: sum的用法、每一行求和、repmat的用法、sum和repmat结合使用减少循环...
- 另种思路:图片转换 变通模拟实现VS2005下TreeView的ChcekBox点击
- 3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束
- Ubuntu装机后的基础应用
- Android 蓝牙技术 实现终端间数据传输
- Elasticsearch中的嵌套查询介绍及实例
- mysql升更新命令_MySQL升级的3种方法
- 软件测试用例详细规范
- kindle3使用技巧
- Qt 窗口属性简介之Qt::WA_DeleteOnClose
- 法大大连续两年中国电子签名市场份额第一
- mac如何彻底删除/卸载程序
- gets和fgets函数及其区别,C语言gets和fgets函数详解
- Python批量自动下载获取图片
- 安装丰巢价格是多少_马桶后方1㎡好几万你不在意,丰巢涨价5毛钱你却斤斤计较...
- WFP(三)——编译、部署驱动文件*.sys——微软msnmntr项目
- 共创软硬件协同生态:Graphcore IPU与百度飞桨的“联合提交”亮相MLPerf
- global(全局变量)
- Redis各版本描述
热门文章
- aidl android 怎么mk编译,使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序
- 金融大数据分析还不简单,有了Smartbi简单几步就能完成
- 专家打分法matlab,针对贝叶斯网络中引入专家评价的先验概率评估方法与流程
- php图马,关于File Upload的一些思考
- [NodeJS实战]NodeJS WebSocket实例
- 邮箱正则表达式和域名长度
- 安卓 获取重定向Url最终地址
- swt/jface控件的隐藏与显示
- python数字转字符串
- 数字化转型案例失利的3大原因 by 彭文华