# 一 字符串格式
s ='我的名字是:%s'%'xio'print(s)# 我的名字是:xio# 字符串的format方法支持的格式化方式
res ='我的名字是{},年龄是{}'.format('xio',18)
res1 ='我的名字是{0},年龄是{1}'.format('xio',18)
ll =['xio',19]
l2 =['男']
res ='我的名字是{0[0]},年龄是{0[1]},性别是{1[0]}'.format(ll, l2)
dic ={'name':'xio','age':19,'sex':'男'}
res1 ='我的名字是{name},年龄是{age},性别是{sex}'.format(**dic)classPerson:def__init__(self):
self.name ='xio'
self.age =19
self.sex ='男'
p = Person()# res='我的名字是{0.name},年龄是{0.age},性别是{0.sex}'.format(p)
res ='我的名字是{obj.name},年龄是{obj.age},性别是{obj.sex}'.format(obj=p)print(res)# 我的名字是xio,年龄是19,性别是男
对象的__format__ 调用format(对象,‘字符串格式’)触发
classPerson():
__dic ={'n-a':'名字是:{obj.name}-----年龄是:{obj.age}','n:a':'名字是:{obj.name}:::::年龄是:{obj.age}','n/a':'名字是:{obj.name}/年龄是:{obj.age}',}def__init__(self, name, age, sex):
self.name = name
self.sex = sex
self.age = age
def__format__(self, format_spec):# print(format_spec)if format_spec and format_spec in self.__dic:
s = self.__dic[format_spec]else:
s = self.__dic['n-a']return s.format(obj=self)
p = Person('xio',18,'男')
res =format(p)# 名字是:xio-----年龄是:18
res =format(p,'n-a')# 名字是:xio-----年龄是:18
res =format(p,'n/a')# 名字是:xio/年龄是:18
res =format(p,'n:a')# 名字是:xio:::::年龄是:18print(res)
__del__ 调用del功能时触发
classPerson:def__init__(self, name, age):
self.name = name
self.age = age
def__del__(self):# 资源清理工作print('xxxx')
p = Person('xio',18)del p
# xxxx
classProcessFile:def__init__(self,name):
self.f=open(name,'wt',encoding='utf-8')defwrite(self,s):
self.f.write(s)defclose(self):
self.f.close()def__del__(self):# 请理性的工作
self.f.close()
p=ProcessFile('a.txt')
p.write('xxxx')
p.close()# del p 系统结束后会自动运行,然后触发__del__方法
# __all__:使用from a import *导入模块时,限制能够使用的属性# __all__=['age','name']'''a.py
__all__ = ['age', 'name']
age = 10
name = 'xio'
sex = '男'
'''from a import*print(age)# 10print(name)# xioprint(sex)# NameError: name 'sex' is not defined # 调不到
__iter__ 和 __next__
-可迭代对象:对象有__iter__方法,这个对象就是一个可迭代对象
-for循环本质就是在循环可迭代对象
-for i in 对象(必须是可迭代对象)
-for循环的本质:先调用对象的__iter__得到一个迭代器对象,然后调用迭代器
对象的__next__ 方法,每次获得一个值(next这种获取值的方式不依赖于索引,又叫迭代循环)
-迭代器对象:
-既有__iter__又有__next__的对象,就是迭代器对象
-迭代器对象一定是可迭代对象
-定制自己的可迭代对象
-重写类中的__iter__和__next__
-让它支持for循环直接循环(做出一种不依赖于索引取值的方式)
-不停的return 值,当要停下时,抛出异常
# 0 链式调用(跟语言无关)# f.test().test2().test3() # java,js:中广泛应用,设计程序的模式# 如何实现支持链式调用的对象classFoo:def__init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
defprint_name(self):print(self.name)return self
defprint_age(self):print(self.age)return self
defprint_sex(self):print(self.sex)return self
f = Foo('xio',16,'男')
f.print_name()
f.print_sex()
f.print_age()# 链式调用
f.print_name().print_sex().print_age()# 每次用.调用完得到的都是return的返回值
__iter__ 和 __next__ 的应用
# 1 给一个类,重写__iter__,__next__classFoo:def__init__(self):
self.__x =1def__iter__(self):return self
def__next__(self):
self.__x +=1return self.__x
f = Foo()# f就是一个可迭代对象,所以他就能够被for 循环for i in f:# f.__iter__()----->每循环一次,调用一下 f.__next__()print(i)
# 自定制可迭代对象(自己写的对象,可以迭代,可以被for循环)# 加入异常,for循环该对象,可以停止# 实现自己的rangeclassMyRange:def__init__(self, start, end, step=1):
self.__start = start
self.__end = end
self.__step = step
def__iter__(self):return self
def__next__(self):
self.__start += self.__step
if self.__start >= self.__end:raise StopIteration('')# 抛出一个异常,程序就结束了return self.__start
for i in MyRange(1,20):print(i)
练习题:斐波那契数列(通过__iter__和__next__实现)
classFib:def__init__(self, count):
self.start =0
self.second =1
self.count = count
def__iter__(self):return self
def__next__(self):
self.start, self.second = self.second, self.start + self.second
if self.start >= self.count:raise StopIteration()return self.start
for i in Fib(100):print(i)
__len__
# __len__:计算对象长度,返回几,len(对象),结果就是几classFoo:def__init__(self, name, age):
self.name = name
self.age = age
def__len__(self):# return len(self.__dict__)return5
f = Foo('xio',19)
f.hobby ='xxx'print(len(f))# 5