- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python元类与迭代器生成器案例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
__getattr__是当类调用一个不存在的属性时才会调用getattr魔法函数,他传入的值item就是你这个调用的不存在的值。 __getattribute__则是无条件的优先执行,所以如果不是特殊情况最好不要用__getattribute__.
1
2
3
4
5
6
7
8
9
10
|
class
User(
object
):
def
__init__(
self
, name, info):
self
.name
=
name
self
.info
=
info
def
__getattr__(
self
, item):
return
self
.info[item]
ls
=
User(
"李四"
,{
"gender"
:
"male"
})
print
(ls.gender)
|
属性描述符介绍 属性描述符是一个强大的通用协议。它是properties, methods, static methods, class methods 和super()的调用原理.
属性描述符协议 属性描述符是实现了特定协议的类,只要实现了__get__,__set__和__delete__三个方法中的任意一个,这个类就是描述符,它能实现对多个属性运用相同存取逻辑的一种方式,通俗来说就是:创建一个实例,作为另一个类的类属性.
注意 。
• 如果一个对象同时定义了__get__和__set__方法,它被称做数据描述符(data descriptor).
• 只定义__get__方法的对象则被称为非数据描述符(non-data descriptor).
使用类方法创建描述符 。
• 定义一个IntField类为描述符类 。
• 创建IntField类的实例,作为另一个User类的属性 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
IntField(
object
):
def
__set__(
self
, instance, value):
print
(
"__set__"
)
def
__get__(
self
, instance, owner):
print
(
"__get__"
)
def
__delete__(
self
, instance):
print
(
"__delete__"
)
class
User(
object
):
age
=
IntField()
ls
=
User()
ls.age
ls.age
=
30
del
ls.age
|
使用属性类型创建描述符 。
除了使用类当作一个属性描述符,我们之前学习的 property(),就是可以轻松地为任意属性创建可用的描述符。创建 property() 的语法是 property(fget=None, fset=None, fdel=None, doc=None) 。
描述符查找顺序 。
• 当为数据描述符时, __get__优先级高于__dict__ • 当为非数据描述符时,__dict__优先级高于__get__ 。
元类介绍 。
元类实际上就是创建类的类 。
实现如下:
• 定义创建类的函数create_class • 如果给create_class传的参数为user,则创建User类 。
type()创建元类 。
• 第一个参数:name表示类名称,字符串类型 • 第二个参数:bases表示继承对象(父类),元组类型,单元素使用逗号 • 第三个参数:attr表示属性,这里可以填写类属性、类方式、静态方法,采用字典格式,key为属性名,value为属性值 。
1
2
3
4
5
6
7
8
|
def
__init__(
self
, name):
self
.name
=
name
print
(
"i am __init__"
)
User
=
type
(
"User"
, (), {
"age"
:
18
,
"__init__"
:__init__})
obj
=
User(
"amy"
)
print
(obj.name)
|
metaclass属性 。
如果一个类中定义了__metalass__ = xxx,Python就会用元类的方式来创建类,就可以控制类的创建行为 比如,以下代码,再不改变类属性的抒写情况下,将属性名规定为大写访问.
1
2
3
4
|
class
MyClass(
object
):
name
=
"ls"
mc
=
MyClass()
print
(mc.name)
|
迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来 迭代提供了一种通用的不依赖索引的迭代取值方式 。
可迭代对象 。
可以用for循环遍历的对象都是可迭代对象。 • str,list,tuple,dict,set等都是可迭代对象。 • generator,包括生成器和带yield的生成器函数.
判断是否可迭代 。
除了看内置是否含有__iter__方法来判断该对象是否是一个可迭代的对象之外,我们还可以使用 isinstance() 判断一个对象是否是 Iterable 对象 • isinstance()–>用来判断对象是否是相应类型,与type()类似.
1
2
3
4
|
from
collections
import
Iterable,Iterator
print
(
isinstance
(
'abc'
,Iterable))
# True
print
(
isinstance
([
1
,
2
,
3
,
4
],Iterable))
# True
print
(
isinstance
(
123
,Iterable))
# False
|
迭代器对象 。
• 有内置的__next__()方法的对象,执行该方法可以不依赖索引取值 • 有内置的__iter__()方法的对象,执行迭代器的__iter__()方法得到的依然是迭代器本身 需要注意的是,可迭代对象不一定是迭代器 。
iter() 。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 那我们可以通过iter()方法将可迭代的对象,转为迭代器.
1
2
3
|
li
=
[
1
,
2
,
3
,
4
]
lis
=
iter
(li)
print
(
type
(lis))
# <class 'list_iterator'>
|
注意: • 迭代器不可以通过下标取值,而是使用__next__()或者next()。但是只要超出范围则直接报错StopIteration.
1
2
3
4
5
6
7
8
9
|
print
(lis[
0
])
# 报错 not subscriptable
print
(lis.__next__())
print
(lis.__next__())
print
(lis.__next__())
print
(lis.__next__())
print
(
next
(lis))
print
(
next
(lis))
print
(
next
(lis))
print
(
next
(lis))
|
• next()只能顺延调用,不能往前.
可迭代对象与迭代器区别 • 可用于for循环的都是可迭代类型 • 作用于next()都是迭代器类型 • list、dict、str等都是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转为迭代器 • python的for循环本质就是通过不断调用next()函数实现的 。
生成器定义 在Python中,一边循环一边计算的机制,称为生成器:generator。 为什么要有生成器 列表所有数据都在内存中,如果有海量数据的话会非常消耗内存。 比如说:我们仅仅需要访问前面几个元素,但后面绝大多元素占用的内存就会浪费了。 那么生成器就是在循环的过程中根据算法不断推算出后续的元素,这样就不用创建整个完整的列表,从而节省大量的空间。 总而言之,就是当我们想要使用庞大数据,又想让它占用的空间少,那就使用生成器.
生成器表达式 生成器表达式来源于迭代和列表解析的组合,生成器和列表解析类似,但是它使用()而不是[].
1
2
3
4
5
6
7
8
9
10
11
|
g
=
(x
for
x
in
range
(
5
))
print
(g)
# generator object
print
(
next
(g))
print
(
next
(g))
print
(
next
(g))
print
(
next
(g))
print
(
next
(g))
# 超出报错
print
(
next
(g))
for
i
in
g:
print
(i)
|
生成器函数 当一个函数中包含yield关键字,那么这个函数就不再是一个普通的函数,而是一个generator。调用函数就是创建了一个生成器对象。其工作原理就是通过重复调用next()或者__next__()方法,直到捕获一个异常。 比如: 实现斐波那契数列,除第一个和第二个数外,任何一个数都可以由前两个相加得到: 1,1,2,3,5,8,12,21,34… 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def
createNums():
print
(
"-----func start-----"
)
a,b
=
0
,
1
for
i
in
range
(
5
):
# print(b)
print
(
"--1--"
)
yield
b
print
(
"--2--"
)
a,b
=
b,a
+
b
print
(
"--3--"
)
print
(
"-----func end-----"
)
g
=
createNums()
print
(
next
(g))
print
(
next
(g))
print
(
next
(g))
print
(
next
(g))
print
(
next
(g))
|
注意:
• yield返回一个值,并且记住这个返回值的位置,下次遇到next()调用时,代码从yield的下一条语句开始执行。与return的差别是,return也是返回一个值,但是直接结束函数.
迭代器与生成器 。
• 生成器能做到迭代器能做的所有事 。
• 而且因为生成器自动创建了iter()和next()方法,生成器显得简洁,而且高效.
读取大文件 。
文件300G,文件比较特殊,一行 分隔符 {|} 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def
readlines(f,newline):
buf
=
""
while
True
:
while
newline
in
buf:
pos
=
buf.index(newline)
yield
buf[:pos]
buf
=
buf[pos
+
len
(newline):]
chunk
=
f.read(
4096
*
10
)
if
not
chunk:
yield
buf
break
buf
+
=
chunk
with
open
(
'demo.txt'
) as f:
for
line
in
readlines(f,
"{|}"
):
print
(line)
|
到此这篇关于Python元类与迭代器生成器案例详解的文章就介绍到这了,更多相关Python元类与迭代器生成器内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_45568391/article/details/106911607 。
最后此篇关于Python元类与迭代器生成器案例详解的文章就讲到这里了,如果你想了解更多关于Python元类与迭代器生成器案例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!