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程序中所有的数据 ...
随机推荐
- requirejs 第一个实例
介绍:requirejs 是实现了模块化加载和按需加载的js库,防止了全局变量的污染. 1.安装 require : 在require 中文网下载 http://www.requirejs.cn/,然 ...
- 【BZOJ3209】花神的数论题 数位DP
[BZOJ3209]花神的数论题 Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级 ...
- Keywords Search(AC自动机模板)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- 1*SUM(i) 开源社区
w 算法优化 Cells(i, "Y") + Cells(i, "Z") * 0.2 多计算了一次是 1*SUM(i)次 Sub 订单利润() Dim Adju ...
- IBM WebSphere cannot start in RAD 9.1
Have solved the problem. Solutions follows Step 1: double click on "WebSphere Application Serve ...
- python模块学习(三)
logging模块 简单应用 import logging logging.debug('debug message') logging.info('info message') logging ...
- Linux中接收键盘输入
read 选项 变量名 -p "提示信息" -t 指定等待时间,不指定则一直等待 -n 指定接收的字符数,不指定则不限制 -s 隐藏输入的数据,适用于机密 ...
- app是什么意思?智能手机的第三方应用程序
APP,在手机中的意思就是application的简称,也就是应用程序的意思,一般指手机软件,是安装在手机上的软件,完善原始系统的不足与个性化.APP是智能手机的第三方应用程序,app通常分为个人用户 ...
- Maven学习笔记—坐标和依赖
Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...
- Java替换字符串中的占位符
在开发中,会有动态配置字符串其中的某些字符,如何使用字符中的占位符,并且在代码动态替换占位符实现动态配置字符串! 1.定义字符串时,再string文件添加字符串: 注意!记得要在字符文件中加上这些: ...