1,属性访问
1,可以通过 " . "来访问对象属性
class C: ? ? def __init__(self): ? ? ? ? self.x='X-man'
c=C() c.x >>>'X-man'
2,property()函数可以用属性去访问属性?
class C:
def __init__(self,size=10):
self.size=size
def getsize(self):
return self.size
def setsize(self,value):
self.size= value
def delsize(self):
del self.size
x=property(getsize,setsize,delsize)
?3,对一道题陷入死循环的理解
- 一个矩形类,默认有宽和高两个属性,如果为一个叫square属性赋值,那说明这是一个正方形,值就是正方形的边长
class rectangle:
def __init__(self,width=0,height=0):
self.width=width
self.height=height
def __setatter__(self,name,value):
if name='square':
self.width=value
self.height=value
else:
self.name=value
注意:
- __setattr__(self,name,value)--->定义一个属性被设置的行为
- 给self.width和self.height初始化赋值会自动触发__setattr__()魔法方法
?2,迭代器和生成器
1,迭代器:类似于循环,每一次重复的过程称为一次迭代的过程,每一次迭代的结果会作为下一次迭代的初始值
- iter()得到它的迭代器
- next()迭代器返回下一个值
从而推断For语句的工作原理
string='FoshC'
it=iter(string)
while True:
try:
each=next(it)
except StopIteration:
break
print(each)
F o s h C?
- 魔法方法__iter__()和__next__()
class Fibs:
def __init__(self,n=20):
self.a=0
self.b=1
self.n=n
def __iter__(self):
return self
def __next__(self):
self.a,self.b=self.b,self.a+self.b
if self.a>self.n:#防止不断迭代
raise StopIteration
return self.a
fibs=Fibs()
for each in fibs:
print(each)
1 1 2 3 5 8 13?
2,生成器
加上yield语句
用生成器实现裴波那契数列
def fibs():
a=0
b=1
while True:
a,b=b,a+b
yield a
for each in fibs():
if each > 100:
break
print(each)
[i for i in range(100) if not (i%2) and (i%3)]
{i : i%2 == 0 for i in range(10)}?
{i for i? in {1,1,2,3,3,4,5,5,5,6,7,7,8}}?
>>>{1,2,3,4,5,6,7,8}
sum(i for i in range (100) if i%2)
|