def createNum():
print('-----start----')
a,b = 0,1
for i in range(5):
print('----- 1 ----')
yield b
print('----- 2 ----')
a,b = b,a+b
print('----- 3 ----')
print('------stop------')
调用结果
createNum() #没有任何打印
a = createNum() # a此时就是一个生成器
print(a)
<generator object createNum at 0x102981728>
- next(a)
-----start----
----- 1 ----
- next(a)
----- 2 ----
----- 3 ----
----- 1 ----
添加了yield b之后,每次调用next(a)循环都会在yield 处停止,只到下一次调用生成器时,才会继续往下执行代码
next(a) 等价于 a.next()
send
def createNum():
i = 0
while i < 5:
temp = yield i
print(temp)
i += 1
a = createNum()
next(a) # 没有任何打印
next(a) # 打印None
next(a) # 打印None
next(a) # 打印None
a.send('hahaha') # hahaha
#说明send函数是在给yield i这个模块代码赋值。
注意事项:如果不调用next(a)或者a.next(),直接调用send('haha') 对yield赋值导致程序崩溃,愿意在于send找不到yield,正确的方式是send(None)
元类(type)
类也是对象,我们可以动态的创建它们
type叫做元类 ,使用type可以创建类
Person2 = type("Person2",(),{"num":0})
p1 = Person2()
print(p1.num)
创建一个带函数的类
def printNum(self):
print("----num--%d---"%self.num)
Person3 = type("Person3",(),{"printNum":printNum})
p3 = Person3()
p3.num = 100
p3.pringNum()
创建一个继承的类
Man = type("Man",(Person,){})
xiaoming = Man()
xiaoming.eat()
元类就是用来创建类的东西,元类就是类的类
Myclass = MetaClass() #使用元类创建出的一个对象,这个对象称为"类"
MyObject = MyClass() #使用“类”来创建出实例对象
MyClass = type('MyClass',(),{})
可以使用 _ _ class _ _ 来判断是元类
MyClass._ class _
_ _ metaclass _ _属性
class Foo(object):
__metaclass__ = something... 代码..
#something... 代码.. 使用元类创建类的代码。也就是说__metaclass__属性决定了class类的创建