前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python稍难一点的说明

python稍难一点的说明

作者头像
哒呵呵
发布2018-08-06 15:24:38
3670
发布2018-08-06 15:24:38
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记
代码语言:javascript
复制
这是稍微高级一点的话题
1.首先来看看什么是闭包:
def sort(values, groups):
    def helper(x):
        if x in groups:
            return (0, x)
        return (1, x)
    values.sort(key=helper)
这是一种定义在某种作用域的函数,python的函数是first-class object。
使用的时候,要注意变量作用域。python解释器遵循LEGB规则,会首先查找当前函数的作用域,任何外围作用域(比如这个闭包外面的函数)
,包含当前代码模块的作用域,内置作用域(也就是包含len,str的作用域)。
所以在闭包使用时,应该注意
def sort(values, groups):
    found = False
    def helper(x):
        if x in groups:
            found = True
            return (0, x)
        return (1, x)
    values.sort(key=helper)
    return found
内层函数对found的修改并不会影响到外层函数,因为这样可以防止函数中的局部变量污染函数外面的变量。

2.简单的接口应该接受函数,而不是类的实例
例如,在collections模块中有一个defaultdict类,它可以实现在一个字典里要是没有查到相应的key,就会使用某个函数为该键创建新值
import collections

def log():
    print('add')
    return 0


a = {'1':2}
b = [(3,4)]

res = collections.defaultdict(log, a)
print(res)
for key,values in b:
    res[key]

print(res)
defaultdict(<function log at 0x00000268235911E0>, {'1': 2})
add
defaultdict(<function log at 0x00000268235911E0>, {3: 0, '1': 2})
 
这样的话,想想是不是会使得你的类更好的去测试。

3.不建议使用private属性
python认为后来者,会改进你所写的父类,但是如果你大量使用了private属性,后来者就不好改了。你应该在文档中说明每个所保护字段的含义,解释其意义,哪些东西不应该碰,这样的话后来者程序员就明白了。

4.简单描述下类的构建:
--__init__方法是两个下划线,它是用来初始化参数的,并且这个参数在整个实例里可以用和修改。
--你可以继承python的元类,做新的修改,但是不要如下继承:
class superList(list):
这实际上没有修改list这个内置方法
--类还有多态,mix-in等方法,不过就个人而言我更喜欢函数,而不是类。
--类还有更多的神奇方法,之前还准备稍微写下元类,后来想想,这个算是更加有难度了。
--补充下,装饰器和闭包都是用同一个字节码,你可理解装饰器就是先执行外部函数(相对于你所装饰的那个函数),再执行你所装饰的函数。

 

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档