Python 在设计上坚持了清晰划一的风格, 这使得 Python 成为一门易读, 易维护, 并且被大量用户所欢迎的, 用途广泛的语言. 设计者开发时总的指导思想是, 对于一个特定的问题, 只要有一种最好的方法来解决就好了.
最近觉得 Python 太 "简单了", 于是在老司机面前放肆了一把:"我觉得 Python 是世界上最简单的语言!". 于是老司机给我了一份满分 100 分的 6 道题, 下面是题目的错误实录:
1, 你恐怕不会留意到的列表生成器
检查一下下面的代码会报错的原因, 并说出来?
列表生成器的正解答案如下:
或者答案可以是这样
此内容的再补充
2, 据说是最难得装饰器描述: 按照实际情况来写一个类装饰器用来度量函数 / 方法运行时间, 你看怎么实现?
此类装饰器能够运行在普通函数上:
此类装饰器运行在方法上会报错, 为什么?
如果坚持使用类装饰器, 应该如何修改?
此问题的答案是
3,Python 调用机制看你会不会
描述: Python 开发者们知道 __call__ 方法可以用来重载圆括号调用, 其实问题根本不是这个.
现在大家可以看到 a() 似乎等价于 a.__call__() , 好的, 现在我们写出了如下的代码
4, 描述符你会犯错吗?
描述: 如果要写一个 Exam 类, 其属性 math 为 [0,100] 的整数, 若赋值时不在此范围内则抛出异常, 你是否决定用描述符来实现这个需求.
看起来一切正常. 不过尝试说明是什么问题, 改写 Grade 描述符试一下:
不过这样会导致更大的问题, 请问该怎么解决这个问题?
答案
两种方法
第一种:
5,Python 继承机制的坑
描述:
试求出以下代码的输出结果.
答案: 输出是 36 , 具体可以参考 New-style Classes , multiple-inheritance
6,Python 的特殊方法的使用模式
描述: 写了一个通过重载 new 方法来实现单例模式的类.
现在有一堆类要实现为单例模式, 打算照着写一个元类, 这样可以让代码复用:
报错啊, 下面这段代码能够捕获一切属性调用并打印参数
试解释为什么给 getattribute 打补丁成功, 而 new 打补丁失败.
如果坚持使用元类给 new 打补丁来实现单例模式, 应该怎么修改?
答案:
其实这是最气人的一点, 类里的 __new__ 是一个 staticmethod 因此替换的时候必须以 staticmethod 进行替换. 答案如下:
结语:
Python 这门语言还是博大精深的, 如果你现在刚刚学不久就以为很好了, 小心这里面其实有很多坑.
来源: http://developer.51cto.com/art/201810/586021.htm