元类

在python中一切皆对象,类也是对象,只不过类是一个创建对象的对象,我们可以在类中动态的创建一个类,比如

deffunc(name):if name == "Plane":classPlane(object):pass

returnPlaneelse:classMetrorolite(object):pass

return Mrtroolite

虽然根据上述代码可以动态创建一个类,但是整个类的代码仍需要我们编写的

type()有两种作用:

1、检查对象类型

classPeople(object):def __init__(self, id, name, employees):

self.id=id

self.name=namedeffunc(self):return

if __name__ == "__main__":

id= 1001name= "abc"employees= [1,2,3]

people=People(id, name, employees)#检查整型

print(type(id)) #

#检查字符串型

print(type(name)) #

#检查列表型

print(type(employees)) #

#检查类的对象型

print(type(people)) #

#检查类类型

print(type(People)) #

#检查函数型

print(type(people.func)) #

#如果我们对其结果再次type()得到的结果都是type类型,这就验证了一切解释对象

2、还有一个高大上的作用就是动态的创建类

语法:type(类名, 由父类名称组成的元组(可以为空), 包含属性的字典(名称和值))

返回值是一个类

#空类

Chinese = type("People", (), {})#继承父类,父类以元组的形式表达

Chinses = type("People", (object, ), {})#给类一些属性(下述都是类属性)和方法(方法可以自定义,依次是实例方法、类方法、静态方法)

defsayHI(self):print("HI")

@classmethoddefsayHello(cls):print("Hello")

@staticmethoddefsayBye():print("Bye")

Chinese= type("People", (object, ), {"id": 1001, "name": "zhangsan", "func1": sayHI, "func2": sayHello, "func3": sayBye})#Chinese 不是类名,People是类名,Chinese是一个引用变量

元类的定义:

元类就是用来创建类的“东西”

元类是类的类, 是类的模板

元类是用来控制如何创建类的, 正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为

元类的实例化结果是我们用class定义的类,正如类的实例为对象

type是python的一个内建元类, 用来直接控制生成类

python中任何class定义的类其实都是type类实例化的对象

当然了,你也可以创建自己的元类,需要继承 type。

元类的定义和使用:

通过函数返回一个元类:

#自定义函数

defsummary(a, b):return a+b#这个函数的作用是修改当前类的属性的值和方法的功能,并且返回一个类

defupper_attr(future_class_name, future_class_parent, future_class_attr):#可以修改当前类定义的属性的值和方法的功能

newAttr ={}for name, value infuture_class_attr.items():if name == "bar":

newAttr[name]= "变量值修改了"

if name == "func":

newAttr[name]=summaryreturntype(future_class_name, future_class_parent, newAttr)class Operation(object, metaclass=upper_attr):

bar= "修改之前的值"func=Noneif __name__ == "__main__":print(Operation.bar) #变量值修改了

print(Operation.func(2, 4)) #返回值6

通过继承type生成元类(博主也没有看懂,了解即可,用到极少):

classMeta(type):def __init__(cls, *args, **kwargs):

super().__init__(*args)def __new__(cls, *args, **kwargs):

name, bases, attrs = args

return super().__new__(cls, name, bases, attrs)

class M_Class(metaclass=Meta):

def __new__(cls, *args, **kwargs):

return super().__new__(cls)

def __init__(self):

pass

动态语言

静态语言和动态语言的区别:

静态语言(强类型语言)

静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要 求在使用变量之前必须声明数据类型。

例如:C++、Java、Delphi、C#等。

动态语言(弱类型语言)

动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明, 通常变量的类型是被赋值的那个值的类型。

例如:PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。

动态语言的特性:

运行的过程中给对象绑定(添加)属性

运行的过程中给类绑定(添加)属性

运行的过程中给类绑定(添加)方法

运行的过程中删除属性、方法

classPerson(object):def __init__(self, name, age):

self.name=name

self.age=agedefshow():print("通过类动态增加类方法.")

@classmethoddefshow2(cls):print("通过类动态增加类方法,并且打印id.", cls.id)if __name__ == "__main__":

person= Person("张三", 22)#运行过程中,给对象添加属性

person.phone = "1847015XXXX"

print(person.phone) #1847015XXXX

#运行过程中,对象是不能添加方法,否则会报错

#person.func = show

#person.func()

#运行过程中,给类增加属性

Person.id = 10001

print("对象访问类属性", person.id) #对象访问类属性10001

print("类访问类属性", Person.id) #类访问类属性10001

#运行过程中给类增加方法

Person.func =show

Person.func()#通过类动态增加类方法.

#运行过程中给类增加类方法

Person.func =show2

Person.func()#通过类动态增加类方法,并且打印id。10001

__slots__

__slots__作用:

Python允许在定义class的时候,定义一个特殊变量__slots__来限制该 class能添加的属性,当前类就不能定义或者增加__slots__之外的属性了

__slots__注意事项:

__slots__只对类的实例化对象进行限制,不对类进行限制,__slots__变量值是以元组形式表示

__slots__不仅限制类对象的属性,还限制类对象的方法

__slots__仅对当前类起作用,对继承的子类不起作用

在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的 __slots__

classPerson(object):__slots__ = ("name", "age")def __init__(self, name, age):

self.name=name

self.age=ageif __name__ == "__main__":

person= Person("张三", 22)#运行过程中,给对象添加属性实例对象属性只限于name,age

#person.phone = "1847015XXXX"

#print(person.phone)

#运行过程中,给类增加属性,__slots__ 不限制类

Person.id = 10001

print("对象访问类属性", person.id) #对象访问类属性 10001

print("类访问类属性", Person.id) #类访问类属性 10001

生成器

概念:Python中,这种一边循环一边计算的机制,称为生成器:generator。

创建生成器的两种方式:

方法1:列表生成式的 [ ] 改成 ( )

numbers = ( i for i in range(100))

通过 next() 函数获得生成器的下一个返回值

没有更多的元素时,抛出 StopIteration 的异常

正确的方法是使用 for 循环,因为生成器也是可迭代对象,并且不需要关心 StopIteration 异

方法2:使用函数创建生成器(实例)

#斐波那契数列

deffibonacci(num):

a=0

b= 1count=0

temp= 1

while count

a, b= b, a+b

count+= 1fi= fibonacci(4)print(next(fi)) #1

print(next(fi)) #1

print(next(fi)) #2

print(next(fi)) #3

#没有更多的元素时,抛出 StopIteration 的异常#正确的方法是使用 for 循环,因为生成器也是可迭代对象,并且不需要关心StopIteration 异常

print(next(fi)) #error

#所以在使用生成器的时候,需要捕获异常

fi = fibonacci(10)whileTrue:try:print(next(fi))exceptStopIteration as e:print(e)break

另外生成器也可以传递参数通过send(参数值):

#斐波那契数列

deffibonacci(num):

a=0

b= 1count=0

temp= 1

while count

temp= yield temp*bprint("temp{}:{}".format(count, temp))

a, b= b, a+b

count+= 1fi= fibonacci(10)print(next(fi))whileTrue:try:print(fi.send(1))except:break

迭代器

可迭代对象:

这里先提一下迭代器对象,如果一个对象可以通for循环进行遍历的对象一般都是迭代器对象;python提供了一个Iterable类就是鉴别对象是否是迭代器对象,在鉴别的过程中需要借助isinstance()方法,这个方法是鉴别对象是否属于一个类的对象,这里不能用type()方法,因为type()的作用是鉴别对象是否是类的实例化对象(通过继承的是false)

首先先简单介绍两者检验对象类型的区别:

classA:def __init__(self):pass

classB(A):def __init__(self):

super().__init__()if __name__ == "__main__":

a= 123

#两者检验整型,类似这种,字符串、列表、元组、集合、字典都是一样的结果

print(type(a) == int) #True

print(isinstance(a, int)) #True

#两者主要的区别 直接通过类生成的对象,两者检验的结果是一样的

b =B()print(type(b) == B) #True

print(isinstance(b, B)) #True

#若是父类就会有不一样的结果

print(type(b) == A) #False

print(isinstance(b, A)) #True

所以在检验对象时,采用isinstance()比较好,

from collections importIterableclassA:def __init__(self):pass

classB(A):def __init__(self):

super().__init__()#实例生成器函数

deffunc(self, a):yielda

a= a + 1

if a == 5:return

if __name__ == "__main__":

b=B()print(isinstance(b, Iterable)) #False

#像集合数据类型都是可迭代对象,字符串、列表、元组、集合、字典

b = ""

print(isinstance(b, Iterable)) #True

#前面提到的生成器,他也是可迭代对象

a =B()

b=a.func(0)print(isinstance(b, Iterable)) #True

迭代器:

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用 isinstance() 判断一个对象是否是 Iterator 对象:

有两种情况是迭代器:

1、通过生成器函数生成的生成器就是迭代器

2、通iter()函数将可迭代对象转换成迭代器

from collections importIteratorclassA:def __init__(self):pass

classB(A):def __init__(self):

super().__init__()#实例生成器函数

deffunc(self, a):yielda

a= a + 1

if a == 5:return

if __name__ == "__main__":

b=B()print(isinstance(b, Iterator)) #False

#像集合数据类型都是可迭代对象,字符串、列表、元组、集合、字典

b = ""

print(isinstance(b, Iterator)) #True

#前面提到的生成器,他也是可迭代对象

a =B()

b=a.func(0)print(isinstance(b, Iterator)) #True

#通过iter()函数将字符串、列表、元组、集合、字典转换成迭代器

b ={}

b=iter(b)print(isinstance(b, Iterator))

迭代器是可以自定义,只要重写迭代器协议的两个方法

迭代器对象符合迭代器协议,提供两种方法: __iter__() 和 __next__()

__iter__ 返回迭代器对象,并在循环开始时隐式调用。

__next__方法返回下一个值,并在每个循环增量处隐式调用。

__next__在没有更多值返回时引发StopIteration异常,循环结构隐式捕获该 异常以停止迭代。

classCounter:def __init__(self, low, high):

self.current=low

self.high=high#生成器的一般固定写法

def __iter__(self):returnself#在下面函数可以改变迭代器返回的下一个值

def __next__(self):if self.current >self.high:raiseStopIterationelse:

self.current+= 2

return self.current -2

python高级编程教程_python高级编程——入门语法(一)相关推荐

  1. python scrapy 简单教程_python之scrapy入门教程

    看这篇文章的人,我假设你们都已经学会了python(派森),然后下面的知识都是python的扩展(框架). 在这篇入门教程中,我们假定你已经安装了Scrapy.如果你还没有安装,那么请参考安装指南. ...

  2. python继承编程教程_Python高级教程-多重继承

    多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类可以扩展父类的功能. Animal类的层次设计,假设要实现以下4中动物: Dog - 狗狗: Bat - 蝙蝠: Parrot - 鹦鹉 ...

  3. python游戏使用教程_PYTHON游戏编程入门_IT教程网

    资源名称:PYTHON游戏编程入门 内容简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Py ...

  4. python五子棋程序教程_Python 五子棋 编程

    N年前用python写的五子棋游戏,电脑执白子,只能判断一步,新手级别(可以再添加几层循环让它厉害一点) .程序的UI界面是用python的标准库 Tkinter 写的,有点乱,现在已然看不懂. 代码 ...

  5. python正则表达式实例教程_Python正则表达式经典入门教程

    本文实例总结了Python正则表达式基本用法.分享给大家供大家参考,具体如下: 正则表达式在平时做文本处理(爬虫程序去解析html中的字段,在分析log文件的时候需要抓取一些关键数据)的时候经常会用到 ...

  6. python高级教程_Python高级进阶教程

    这个系列的教程是在刘金玉编程的<零基础python教程>基础上的高级进阶应用. 教程列表: Python高级进阶教程001期 pycharm+anaconda3+pyqt5可视化界面开发环 ...

  7. python综合实训项目教程_Python安全编程项目实训教程

    Python是一门非常强大的高级程序语言,其具有语法简洁.可读性高.开发效率高.可移植性.支持自行开发或第三方模块.可调用C和C++库.可与Java组建集成等优点,已被应用到Web开发.操作系统管理. ...

  8. python多线程教程_Python多线程编程教程【2小时学会】

    Python多线程编程教程[2小时学会] 中级共14课 从0开始学习python多任务编程,想了解python高并发实现,从基础到实践,通过知识点 + 案例教学法帮助你想你想迅速掌握python多任务 ...

  9. python软件安装教程_python编程软件安装

    在windows中安装python的方法:1.下载python安装包2.双击安装程序python-2.5.2.msi3.选择installforallusers,点击下一步4.选择安装目录,pytho ...

  10. python核心编程电子书_Python核心编程 PDF 超清第3版

    给大家带来的一篇关于Python编程相关的电子书资源,介绍了关于Python编程.Python核心编程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小22.4 MB,卫斯理编写,目前豆瓣 ...

最新文章

  1. Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程
  2. FDDWNET:模型参数仅为0.8M,速度和准确率综合性能在轻量级分割网络中达到SOTA
  3. java message bus_【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例...
  4. 没有 4.21 ,Linus Torvalds 宣布 Linux 进入 5.0 时代
  5. VC++调试技巧学习总结
  6. python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区
  7. phpzend框架_PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
  8. 机器狗vs警犬!在波士顿动力面前,真狗只能“战术撤退”
  9. Android 和 PHP 之间进行数据加密传输
  10. git切换分支出现head is now at_git寻根——^和~的区别
  11. STM32F407外部晶体改为25M后检测不到芯片的解决办法
  12. linux虚拟内存和win,linux下的vm(虚拟内存)和windows下的作用是一样的,均是防止真实内存资源不足准备的. linux的vm相关参数...
  13. CentOS安装网络驱动
  14. 在Linux环境下Nginx解决跨域问题
  15. java解方程_JAVA解N元一次方程组(矩阵) | 学步园
  16. Linux文件IO操作
  17. Excel删除重复行单不删除单元格
  18. 如果编程语言是一门武功绝学,那么汇编、C语言······
  19. NBA名人堂之-朱利叶斯·欧文|埃尔文·海耶斯|多尔夫·谢伊斯|鲍勃·佩蒂特|戴夫·冰
  20. 35个非常出彩的 Flash 网站作品欣赏

热门文章

  1. 树莓派和Ubuntu16 一些软件的安装
  2. 百度seo排名规则_SEO界的潜规则(百度死不承认的SEO秘密)
  3. mysql正则表达式教学视频教程_MySQL正则表达式入门教程
  4. NYOJ----1591----模拟+map
  5. txt文件保存为Java_java实现写入并保存txt文件
  6. 指数加权移动平均模型_常见收益模型
  7. php连接mysql配置环境变量_Win7 64位操作系统下配置PHP+MySql+Apache环境(转)
  8. docker centos7_CentOS7及Docker配置中文字符集问题
  9. python输入一个区间_Python 学习笔记:根据输入年月区间,返回期间所有的月份...
  10. 2009北海市东盟杯导游大赛,渤锐软件为其提供了计分及抽奖整体解决方案