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------')
調(diào)用結(jié)果
createNum() #沒有任何打印
a = createNum() # a此時就是一個生成器
print(a)
<generator object createNum at 0x102981728>
- next(a)
-----start----
----- 1 ----
- next(a)
----- 2 ----
----- 3 ----
----- 1 ----
添加了yield b之后,每次調(diào)用next(a)循環(huán)都會在yield 處停止,只到下一次調(diào)用生成器時,才會繼續(xù)往下執(zhí)行代碼
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函數(shù)是在給yield i這個模塊代碼賦值。
注意事項:如果不調(diào)用next(a)或者a.next(),直接調(diào)用send('haha') 對yield賦值導(dǎo)致程序崩潰,愿意在于send找不到y(tǒng)ield,正確的方式是send(None)
元類(type)
類也是對象,我們可以動態(tài)的創(chuàng)建它們
type叫做元類 ,使用type可以創(chuàng)建類
Person2 = type("Person2",(),{"num":0})
p1 = Person2()
print(p1.num)
創(chuàng)建一個帶函數(shù)的類
def printNum(self):
print("----num--%d---"%self.num)
Person3 = type("Person3",(),{"printNum":printNum})
p3 = Person3()
p3.num = 100
p3.pringNum()
創(chuàng)建一個繼承的類
Man = type("Man",(Person,){})
xiaoming = Man()
xiaoming.eat()
元類就是用來創(chuàng)建類的東西,元類就是類的類
Myclass = MetaClass() #使用元類創(chuàng)建出的一個對象,這個對象稱為"類"
MyObject = MyClass() #使用“類”來創(chuàng)建出實例對象
MyClass = type('MyClass',(),{})
可以使用 _ _ class _ _ 來判斷是元類
MyClass._ class _
_ _ metaclass _ _屬性
class Foo(object):
__metaclass__ = something... 代碼..
#something... 代碼.. 使用元類創(chuàng)建類的代碼。也就是說__metaclass__屬性決定了class類的創(chuàng)建