给对象或者类添加属性
class Person(object):
def __init__(self, newName, newAge):
self.name = newName
self.age = newAge
p1 = Person("老王", 10)
p1.sex = "男" # 给对象添加属性,该属性只属于该实例对象不属于其他对象
Person.addr = "北京" #给类添加属性,所有实例对象都可以用该属性
print(p1.addr)
print(p1.sex)
北京
男
北京
给对象添加方法
import types
class Person(object):
def __init__(self, newName, newAge):
self.name = newName
self.age = newAge
def eat(self):
print("---eat---")
p1 = Person("老王", 10)
p1.eat = types.MethodType(eat, p1) #将某方法添加到某对象上
Person = types.MethodType(eat, Person) # 同理,将方法添加到类上,所有对象都可用.
p1.eat()
生成器
一遍循环一遍计算的机制,叫做生成器
生成器可以节省空间
生成器创建的方式有两种
一.将列表生成式的[]改为()
a = [x for x in range(4)]
a
Out[3]: [0, 1, 2, 3]
b = (x for x in range(4))
b #返回一个生成器对象
Out[5]: <generator object <genexpr> at 0x7f8116d6e308>
next(b) #可以通过next()函数挨个取值
Out[6]: 0
next(b)
Out[7]: 1
next(b)
Out[8]: 2
二.另一种是带 yield的函数
此时该函数就不是函数了,而是一个生成器对象
def creatNum():
print("---start---")
for i in range(5):
print("---1----")
# print(i)
yield i
print("---2---")
print("---stop---")
creatNum()
In [22]: b = creatNum()
In [23]: b
Out[23]: <generator object creatNum at 0x7f20fdb110f8>
In [24]: next(b)
---start---
---1----
Out[24]: 0
In [25]:
In [25]: next(b)
---2---
---1----
Out[25]: 1
send:为yied 传递参数 + next()功能
def test():
...: i = 0
...: while i<5:
...: temp = yield i
...: print(temp)
...: i += 1
In [3]: a = test()
In [4]: a
Out[4]: <generator object test at 0x7effd0720678>
In [5]: next(a)
Out[5]: 0
In [6]: next(a)
None
Out[6]: 1
In [8]: a.send("hh")
hh
Out[8]: 3