总所周知,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

来点野东西(冷知识,入坑必备,内附猴子补丁)相关推荐

  1. 肝货满满!CV学习笔记:入坑必备

    知乎:云时之间 链接:https://zhuanlan.zhihu.com/p/102044405 编辑:王萌 作者的话 最近因为一些原因被安排去做关于目标跟踪的一些工作,对我来说可谓是一个很大的挑战 ...

  2. 常见web漏洞验证攻略(萌新入坑必备!)

    常见web漏洞验证攻略(萌新入坑必备 首先,祝大家愚人节快乐,玩笑有度,"愚"人同乐. 其次,回想当年刚入坑的时候了解的比较少,也没人带,一般过去就是xss,后来xss的防护了,就 ...

  3. 「星辰大海」你可能需要知道的 promise 知识的总结(内附思维导图)

    前言 接上一期 「高频面试题」女友:消息队列 和 事件循环系统终于弄明白了!(内附思维导图) 文章出炉后,微信好友也多了不少,还挺好的~ 最近又重新整理一下 Promise 相关知识,一方面和上一期文 ...

  4. python file does not exist什么意思_Python的冷知识和坑

    声明 此文章为个人翻译,原文出自:码农周刊. 除非特殊说明,以下代码皆为Python3.4. 译文 Python使用C3算法解决多重继承问题. 根据C3算法,以下代码在处理多重继承的时候,会在clas ...

  5. find linux 指定后缀_Linux终端命令入坑必备知识与技巧

    才接触Linux系统,一些概念简直是一头雾水,那么本文的目的就是在Linux中使用终端输入命令时,常见的一些概念及技巧. 1 什么是主目录(home directory)?Linux是一个典型的多用户 ...

  6. 一个例子入坑布谷鸟算法(附完整py代码)

    布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由 布谷鸟算法思想简介 更新位置的方式 莱维飞行 局部随机行走 抛出个 ...

  7. python dataframe groupby_【Python数据分析基础】入坑必备的数据预处理操作

    本文解决的是2类目标业务: 有数据不知道怎么做数据分析操作的. 自己有思路不知道怎么落地实现的. Python数据分析基础必用品 office软件(推荐2016版) Python开发环境(推荐Anac ...

  8. 【华为云技术分享】敏捷DevOps知识卡大全(内附下载资料)

    如果您曾经对敏捷或DevOps的结构.知识有过疑问,那么您将在[敏捷智库]里找到答案,本文将为大家带来用户故事拆分.DevOps转型闭坑指南的精彩内容. 知识卡每周持续更新,请收藏关注~ 如果您想在知 ...

  9. linux使用TC并借助ifb实现入向限速(内附配置实例)

    ifb的原理概述 和tun一样,ifb也是一个虚拟网卡,和tun一样,ifb也是在数据包来自的地方和去往的地方做文章.对于tun而言,数据包在xmit中发往字符设备,而从字符设备写下来的数据包则在tu ...

最新文章

  1. JEECMS站群管理系统-- Jeecms项目导入myeclipse
  2. matlab中repmat的用法,Matlab: sum的用法、每一行求和、repmat的用法、sum和repmat结合使用减少循环...
  3. 另种思路:图片转换 变通模拟实现VS2005下TreeView的ChcekBox点击
  4. 3.mysql的中文问题,database级操作,表级操作,数据CRUD,分组操作,时间和日期,字符串相关函数,表的约束
  5. Ubuntu装机后的基础应用
  6. Android 蓝牙技术 实现终端间数据传输
  7. Elasticsearch中的嵌套查询介绍及实例
  8. mysql升更新命令_MySQL升级的3种方法
  9. 软件测试用例详细规范
  10. kindle3使用技巧
  11. Qt 窗口属性简介之Qt::WA_DeleteOnClose
  12. 法大大连续两年中国电子签名市场份额第一
  13. mac如何彻底删除/卸载程序
  14. gets和fgets函数及其区别,C语言gets和fgets函数详解
  15. Python批量自动下载获取图片
  16. 安装丰巢价格是多少_马桶后方1㎡好几万你不在意,丰巢涨价5毛钱你却斤斤计较...
  17. WFP(三)——编译、部署驱动文件*.sys——微软msnmntr项目
  18. 共创软硬件协同生态:Graphcore IPU与百度飞桨的“联合提交”亮相MLPerf
  19. global(全局变量)
  20. Redis各版本描述

热门文章

  1. aidl android 怎么mk编译,使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序
  2. 金融大数据分析还不简单,有了Smartbi简单几步就能完成
  3. 专家打分法matlab,针对贝叶斯网络中引入专家评价的先验概率评估方法与流程
  4. php图马,关于File Upload的一些思考
  5. [NodeJS实战]NodeJS WebSocket实例
  6. 邮箱正则表达式和域名长度
  7. 安卓 获取重定向Url最终地址
  8. swt/jface控件的隐藏与显示
  9. python数字转字符串
  10. 数字化转型案例失利的3大原因 by 彭文华