python进阶01
基础部分python学完,咱们可以深入了解下python高阶知识点,让我们一起来学习吧!
1.面向对象进阶
1)元类
1.1.1:python创建类原理
python创建类:
class ObjectCreator:
pass
写了class,python编译器就自动创建了class类了,内部创建的原理:先在内部找属性__metaclass__;__init__等做出相应的处理后再通过type元组来创建:type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))如:Test2 = type("Test2",(),{}) #定了一个Test2类;
元类就是用来创建这些类(对象)的,元类就是类的类,你可以这样理解为
MyClass = MetaClass() #使用元类创建出一个对象,这个对象称为“类”
MyObject = MyClass() #使用“类”来创建出实例对象
1.1.2:python对象属性__metaclass__的有趣地方
__metaclass__属性:创建类时会先在里面查找是否有__metaclass__属性,有的话就通过这个属性指定的方法创建类;没有就往上级找指到找到,没有找到就通过type方式创建
class Foo(object):
__metaclass__ = something…
...省略...
例子:通过__metaclass__属性来控制模块里所有的类的属性都应该是大写形式:
#-*- coding:utf- -*-
def upper_attr(future_class_name, future_class_parents, future_class_attr): #遍历属性字典,把不是__开头的属性名字变为大写
newAttr = {}
for name,value in future_class_attr.items():
if not name.startswith("__"):
newAttr[name.upper()] = value #调用type来创建一个类
return type(future_class_name, future_class_parents, newAttr) class Foo(object, metaclass=upper_attr):
bar = 'bip' print(hasattr(Foo, 'bar'))
print(hasattr(Foo, 'BAR')) f = Foo()
print(f.BAR)
2)动态语言
1.2.1定义:
动态语言是高级程序设计语言的一个类别,具体:在运行时可改变其结构的语言。如:新的函数对象代码可以被引进,已有的函数可被清除。
1.2.2 动态给实例绑定属性:仅作用于当前实例
>>> class Person(object):
def __init__(self, name = None, age = None):
self.name = name
self.age = age
>>> P = Person("小明", "")
>>> P.sex = "male" #动态给实例绑定属性
>>> P.sex
'male'
>>>
1.2.3 动态给类绑定属性:能作用于之后通过类创建的实例
>>> P1 = Person("小丽", "")
>>> P1.sex Traceback (most recent call last):
File "<pyshell#21>", line , in <module>
P1.sex
AttributeError: Person instance has no attribute 'sex' >>>> Person.sex = None #给类Person添加一个属性
>>> P1 = Person("小丽", "")
>>> print(P1.sex) #如果P1这个实例对象中没有sex属性的话,那么就会访问它的类属性
None #可以看到没有出现异常
>>>
1.2.4 例子:给实例绑定属性,方法;给类绑定属性,方法,其中给实例绑定方法是需注意P.run = types.MethodType(run, P)
这种形式而不是直接P.run=run
import types #定义了一个类
class Person(object):
num =
def __init__(self, name = None, age = None):
self.name = name
self.age = age
def eat(self):
print("eat food") #定义一个实例方法
def run(self, speed):
print("%s在移动, 速度是 %d km/h"%(self.name, speed)) #定义一个类方法
@classmethod
def testClass(cls):
cls.num = #定义一个静态方法
@staticmethod
def testStatic():
print("---static method----") #创建一个实例对象
P = Person("老王", )
#调用在class中的方法
P.eat() #给这个对象添加实例方法
P.run = types.MethodType(run, P)
#调用实例方法
P.run() #给Person类绑定类方法
Person.testClass = testClass
#调用类方法
print(Person.num)
Person.testClass()
print(Person.num) #给Person类绑定静态方法
Person.testStatic = testStatic
#调用静态方法
Person.testStatic()
1.2.5 运行时删除属性方法
del 对象.属性名;delattr(对象, "属性名")
1.2.6 通过__slots__来限制
在class定义后加上这个限制如:使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
>>> class Person(object):
__slots__ = ("name", "age") >>> P = Person()
>>> P.name = "老王"
>>> P.age =
>>> P.score =
Traceback (most recent call last):
File "<pyshell#3>", line , in <module>
AttributeError: Person instance has no attribute 'score'
>>>
3)生成器和迭代器
1.3.1 生成器
1.3.1.1 定义
Python一边循环一边计算的机制,成为生成器:generator
1.3.1.2 创建方法
列表生成式改[] 改为 (),生成器保存的是算法
In []: L = [ x* for x in range()] In []: L
Out[]: [, , , , ] In []: G = ( x* for x in range()) In []: G
Out[]: <generator object <genexpr> at 0x7f626c132db0>
1.3.1.3 方法使用
yield:感觉他会将一个值缓存起来next一下就会拿出来
带有 yield 的函数在 Python 中被称之为 generator(生成器);
一般next(含有yield的函数)就能获得值,当拿不到下一个值时,可通过捕获StopIteration异常来处理异常,一般结束数据会保存在这个异常对象value中
例子:
In []: def fib(times):
....: n =
....: a,b = ,
....: while n<times:
....: yield b
....: a,b = b,a+b
....: n+=
....: return 'done'
....: In []: F = fib() In []: next(F)
Out[]: In []: next(F)
Out[]: In []: next(F)
Out[]: In []: next(F)
Out[]: In []: next(F)
Out[]: In []: next(F)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input--8c2b02b4361a> in <module>()
----> next(F) StopIteration: done
next:获得生成器的下一个值
__next__():跟next()差不多
1.3.2 迭代器
1.3.2.1 定义
迭代是访问集合的一种方式;迭代器对象时可记住遍历位置的对象;迭代器对象从集合第一个位置开始迭代,直到所有元素被访问完结束
1.3.2.2 使用
可迭代对象:能直接作用于for循环的对象称为可迭代对象:Iteratable
判断是否是Iteratable:isinstance([],Iteratable)
迭代器:可被next函数调用并返回下一个值称为Iterator对象
判断是否是Iterator对象:insinstance((x for x in range(10)),Iterator)
1.3.2.3 方法使用
iter():生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator ,
把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数。
如:isinstance(iter([]), Iterator)
4)装饰器
装饰器在程序开发中会经常用到一个功能,顾名思义:给原有方法封装一个额外方法,这样既能保证原有代码不变,又能扩展新的功能,遵循了“开发封闭”原则,非常完美!
写代码遵循原则:“开放封闭”,封闭已实现的功能代码块;开放对外扩展开发
例子:
def w1(func):
def inner():
# 验证1
# 验证2
# 验证3
func()
return inner @w1
def f1():
print('f1')
python执行过程:执行w1函数,并将@w1下面函数作为w1参数,即:@w1等价于w1(f1),最终当用户调用f1时,会将f1作为参数传入w1(f1),
之后w1返回做了额外代码处理后将新的f1返回,再执行f1()就是)就是修饰后的实例了,完美!
例子:
#定义函数:完成包裹数据
def makeBold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped #定义函数:完成包裹数据
def makeItalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped @makeBold
def test1():
return "hello world-1" @makeItalic
def test2():
return "hello world-2" @makeBold
@makeItalic
def test3():
return "hello world-3" print(test1()))
print(test2()))
print(test3())) 运行结果:
<b>hello world-</b>
<i>hello world-</i>
<b><i>hello world-</i></b>
python进阶01的更多相关文章
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶01 词典
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 基础教程介绍了基本概念,特别是对象和类. 进阶教程对基础教程的进一步拓展,说明Py ...
- Python进阶量化交易场外篇4——寻找最优化策略参数
新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- SQL Server 进阶 01 数据库的设计
SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- Python网络01 原始Python服务器
原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...
- Python进阶 - 对象,名字以及绑定
Python进阶 - 对象,名字以及绑定 1.一切皆对象 Python哲学: Python中一切皆对象 1.1 数据模型-对象,值以及类型 对象是Python对数据的抽象.Python程序中所有的数据 ...
随机推荐
- EasyUI怎么利用onBeforeRender事件
onBeforeRender事件是view的属性,该事件发生在把ajax请求到的数据填充到表格内容中之前 将此段代码附加在DataGrid初始化后执行,即可完成在DataGrid渲染之前进行操作 // ...
- Linq中GroupBy方法的使用总结(转载)
from:https://www.cnblogs.com/zhouzangood/articles/4565466.html Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.7——使用Android Studio签署发布apk
问题: 想要使用Android studio生成签名配置,给他们分配build类型. 解决方案: Build菜单提供了生成签名配置,Project Structure窗口有tab用于分配不同的type ...
- centos6.4下安装mysql5.7.18
1.安装前工作 在安装前需要确定现在这个系统有没有 mysql,如果有那么必须卸载(在 centos7 自带的是 mariaDb 数据库,所以第一步是卸载数据库). 卸载系统自带的Mariadb: 查 ...
- 2016-06-19 NOIP模拟赛
2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...
- JSON工具类库: alibaba/fastjson 使用记录
JSON工具类库: alibaba/fastjson 使用记录 一.了解JSON JSON标准规范中文文档: http://www.json.org/json-zh.html 最佳实践:http:// ...
- Grafana---graph
主面板简单的命名为Graph.它提供了一组非常丰富的图形选项. 单击面板的标题将显示一个菜单.edit选项为面板打开了额外的配置选项. 一.General general允许定制面板的外观和菜单选项. ...
- HTML随意记录
HTML特殊符号对照表: http://www.cnblogs.com/knowledgesea/archive/2013/07/24/3210703.html
- jPage.js分页
jPage.js插件使用文档 这一款插件主要是为了bootstrap原生的分页功能效果不理想而诞生的一款插件. jPage.js代码更新地址为:https://github.com/leslieSie ...
- 客户端-服务器通信安全 sign key
API接口签名校验,如何安全保存appsecret? - 知乎 https://www.zhihu.com/question/40855191 要保证一般的客户端-服务器通信安全,可以使用3个密钥. ...