SlideShare a Scribd company logo
1 of 25
PYTHON提高课
一切都是对象
WARM UP
• 为什么同样的数据类型,同样
的表达式,结果不一样?
• 如果用“==”比较会出现这种情
况吗?
• “is” 和 “==” 有什么区别?
QUICK LOOK
• 强制缩进
• 解释性、编译性、互动性
• 一种高级编程语言,通用型编程语言
• 支持多种编程范式,包括面向对象、命令式、函数式和过程式编程
• 完全面向对象的语言,函数、模块、数字、字符串都是对象
• 支持继承、重载、派生、多重继承
几个常用的高级特性
PART ONE
• 推导式
• 生成器表达式
• 装饰器
• 上下文管理器
• 反射函数(getattr, setattr)
变量
结果表达式
输入序列
可选条件表达式
{a: a ** 2 for a in range(10) if a % 2}
推导式、生成器表达式
{a for a in range(10) if a % 2}
(a for a in range(10) if a % 2)
字典dict
集合set
元组tuple生成器generator
装饰器
装饰器函数
伪造签名
替身函数
装饰器函数的返回值是替身函数
上下文管理器
上下文准备部分
用户代码执行点
上下文清理部分
上下文管理器
• 一种AOP(Aspect Oriented Programming面向切面编程)机制
• 装饰器也是一种AOP机制
• 装饰器是对象级别的(函数也是一种对象)
• 上下文管理器是代码块级别的
• 上下文管理器原理待续…
装饰器上下文管理器小结
反射工具函数
PART TWO
魔术方法
• 什么是魔术方法?
• 类方法、对象方法
• 以双下划线包围的方法“__xxx__”
• 实现了python里面绝大部分的高级特性
上下文管理器实现
构造、初始化与析构
• __new__(cls, [...)
• __new__ 是实例化类的时候被调用的第一个方法. 它的参数是要实例化的类
,然后是将要传给__init__的所有参数。 __new__ 用得很少,它可以修改实
例。
• __init__(self, [...)
• 最常用的初始化函数。(所有变量应该在该方法内申明)
• __del__(self)
• 对象被垃圾回收的时候调用,del obj 不调用该方法。基本不用。
属性访问控制
• __getattr__(self, name)
• 仅对于不存在的属性访问,一种兜底方法。
• __setattr__(self, name, value)
• 属性赋值,等价于 o.attr = x
• __delattr__(self, name)
• 删除属性,等价于 del o.attr
• __getattribute__(self, name)
• 获取属性(包括存在的属性),等价于 o.attr
属性访问示例
定制化列表
• __len__(self)
• __getitem__(self, key)
• __setitem__(self, key, value)
• __delitem__(self, key)
• __iter__(self)
• __reversed__(self)
• __contains__(self, item)
• __missing__(self, key)
更多的魔术方法…
• 操作符重载
• 类型转换
• 类的描述
• 实例、子类判断行为
• Descriptors 对象
• 拷贝
• 序列化
元编程
PART THREE
• 什么是类?什么是对象?
• 什么是元编程?
• 这里要讨论的问题:类的元编程
• python的类的特殊性
• python2: __metaclass__ python3: class Name(metaclass=…
• 类也是对象
• class和type
• 类的类
• 也是一种AOP手段
开发提示
PART FOUR
• 再三小心使用循环
• 合理使用数据结构
• 优先使用占用空间小的方式
• 按需传参,不要滥传
更多…
开发模式:单例模式、Null对象、观察者模式、
— zwu2@
THANKS
”
“

More Related Content

Similar to Python advanced programming

构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网yang alex
 
成为一个合格的工程师
成为一个合格的工程师成为一个合格的工程师
成为一个合格的工程师huang chengkai
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章浒 刘
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試Wen-Tien Chang
 
七天基于风险测试—Chinatest
七天基于风险测试—Chinatest七天基于风险测试—Chinatest
七天基于风险测试—Chinatestdrewz lin
 
程式設計教與學
程式設計教與學程式設計教與學
程式設計教與學忠憲 李
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMLi Hsuan Hung
 
Database And User Experience for Web Apps
Database And User Experience for Web AppsDatabase And User Experience for Web Apps
Database And User Experience for Web AppsDahui Feng
 

Similar to Python advanced programming (14)

Erlang and HTML5
Erlang and HTML5Erlang and HTML5
Erlang and HTML5
 
构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
 
Test
TestTest
Test
 
成为一个合格的工程师
成为一个合格的工程师成为一个合格的工程师
成为一个合格的工程师
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試
 
第1章 概论
第1章 概论第1章 概论
第1章 概论
 
Excel VBA
Excel VBAExcel VBA
Excel VBA
 
七天基于风险测试—Chinatest
七天基于风险测试—Chinatest七天基于风险测试—Chinatest
七天基于风险测试—Chinatest
 
程式設計教與學
程式設計教與學程式設計教與學
程式設計教與學
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
 
Database And User Experience for Web Apps
Database And User Experience for Web AppsDatabase And User Experience for Web Apps
Database And User Experience for Web Apps
 
Jasmine
JasmineJasmine
Jasmine
 
RSpec & TDD Tutorial
RSpec & TDD TutorialRSpec & TDD Tutorial
RSpec & TDD Tutorial
 

Python advanced programming

Editor's Notes

  1. 题外话:dict.get默认值的行为区别,dict.get不传默认值也会默认None
  2. 每个人应该都知道最基本的魔术方法 __init__. 它是我们定义一个对象初始化行为的方式. 然而, 当执行 x = SomeClass(), __init__ 不是第一个被调用的方法. 事实上, 第一个被调用的是一个叫做 __new__ 的方法, 是它构造了这个对象, 然后将构建参数传递给了初始化方法. 在对象生存周期的另一头, 有个 __del__ 方法. 让我们仔细看一下这3个方法。
  3. 注意点,实现的时候不小心容易造成死循环
  4. 元编程(英语:Metaprogramming),又译超编程,是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的资料,或者在运行时完成部分本应在编译时完成的工作。多数情况下,与手工编写全部代码相比,程序员可以获得更高的工作效率,或者给与程序更大的灵活度去处理新的情形而无需重新编译。 编写元程序的语言称之为元语言。被操纵的程序的语言称之为“目标语言”。一门编程语言同时也是自身的元语言的能力称之为“反射”或者“自反”。
  5. 能不放到循环里的语句,操作尽量提升。 善用生成器,少用完全的list。