- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如果您有超过 1 个具有相同类名的(动态)文本框,并使用 jquery 循环遍历每个所述文本框,您是否可以假设每次选择文本框的顺序都是相同的? 示例: 文本框 1 值 = 1文本框 2 值 = 2文本
有人知道为什么这段代码无法顺利运行吗?它似乎不喜欢使用yield关键字进行迭代:我正在尝试从任何级别的列表或字典中挖掘所有数字(对列表特别感兴趣)。在第二次迭代中,它找到 [2,3] 但无法依次打印
我关于从 mysql 数据库导出数据并将其保存到 Excel 文件(多表)的创建脚本。我需要让细胞动态基因化。该脚本正确地显示了标题,但数据集为空。当我“回显”$value 变量时,我检查了数据是否存
我正在尝试在 Python 中运行模拟,由此我绘制了一个数组的随机游走图,给定了两个变量参数的设定水平。 但是,我遇到了一个问题,我不确定如何迭代以便生成 250 个不同的随机数以插入公式。例如我已经
我是学习 jquery 的新手,所以如果这是一个相对简单的问题,我深表歉意。我有一个 ID 为 ChartstoDisplay 的 asp.net 复选框列表。我正在尝试创建 jquery 来根据是否
我正在尝试根据在任意数量的部分中所做的选择找出生成有效案例列表的最佳方法。也许它不是真正的算法,而只是关于如何有效迭代的建议,但对我来说这似乎是一个算法问题。如果我错了,请纠正我。实现实际上是在 Ja
如果我使用 sr1 为 www.google.com 发送 DNSQR,我会收到几个 DNSRR(s) 作为回复,例如(使用 ans[DNSRR].show() 完成): ###[ DNS Resou
假设有这样一个实体类 @Entity public class User { ... public Collection followers; ... } 假设用户有成千上万的用户关注者。我想分页..
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Nested jQuery.each() - continue/break 这是我的代码: var steps =
我刚从 F# 开始,我想遍历字典,获取键和值。 所以在 C# 中,我会说: IDictionary resultSet = test.GetResults; foreach (DictionaryEn
我知道已经有很多关于如何迭代 ifstream 的答案,但没有一个真正帮助我找到解决方案。 我的问题是:我有一个包含多行数据的txt文件。 txt 文件的第一行告诉我其余数据是如何组成的。例如这是我的
我有 12 个情态动词。我想将每个模态的 .modal__content 高度与 viewport 高度 进行比较,并且如果特定模态 .modal__content 高度 vh addClass("c
在此JSFiddle (问题代码被注释掉)第一次单击空单元格会在隐藏输入中设置一个值,并将单元格的背景颜色设置为绿色。单击第二个空表格单元格会设置另一个隐藏输入的值,并将第二个单元格的背景颜色更改为红
这是一个非常具体的问题,我似乎找不到任何特别有帮助的内容。我有一个单链表(不是一个实现的链表,这是我能找到的全部),其中节点存储一个 Student 对象。每个 Student 对象都有变量,尽管我在
有没有办法迭代 IHTMLElementCollection? 比如 var e : IHTMLLinkElement; elementCollection:IHTMLElementCollect
我正在尝试用 Java 取得高分。基本上我想要一个 HashMap 来保存 double 值(因此索引从最高的 double 值开始,这样我更容易对高分进行排序),然后第二个值将是客户端对象,如下所示
我想在宏函数中运行 while/until 循环,并限制其最大迭代次数。我找到了如何在“通常”sas 中执行此操作: data dataset; do i=1 to 10 until(con
Iterator iterator = plugin.inreview.keySet().iterator(); while (iterator.hasNext()) { Player key
晚上好我有一个简单的问题,我警告你我是序言的新手。假设有三个相同大小的列表,每个列表仅包含 1、0 或 -1。我想验证对于所有 i,在三个列表的第 i 个元素中,只有一个非零。 此代码针对固定的 i
我在 scheme 中构建了一个递归函数,它将在某些输入上重复给定函数 f, n 次。 (define (recursive-repeated f n) (cond ((zero? n) iden
我是一名优秀的程序员,十分优秀!