''' 授权 授权是包装的一个特性,包装一个类型通常是对已经存在的类型的一些定制,这种做法可以新建 修改或删除原有产品的功能,其他的则保持原样 授权的过程,及时所有更新的功能都是由新类的某部分来 处理,但已存在的功能就授权给对象的默认属性 __getattr__ '''
class Open: def __init__(self,filename,mode='r',encoding='utf-8'): # self.filename = filename self.file=open(filename,mode,encoding=encoding) self.mode=mode self.encoding=encoding def write(self,line): print('------------->',line) self.file.write(line) def __getattr__(self, item): return getattr(self.file,item) f1 = Open('a.txt','r+') print(f1.read()) f1.write('333333333333\n')
迭代器
''' 迭代器 ''' class Foo: def __init__(self,n): self.n = n def __iter__(self): return self def __next__(self): if self.n == 0: raise StopIteration('ERROR') self.n -= 1 return self.n f1 = Foo(10) for i in f1: print(i)
''' 迭代器斐波那契 ''' class Foo: def __init__(self): self.a = 1 self.b = 1 def __iter__(self): return self def __next__(self): if self.a >30: raise StopIteration('error') self.a,self.b = self.b,self.a +self.b return self.a l = Foo() for i in l: print(i)
def test(): a = 1 b = 1 for i in range(10): a,b = b, b+a print(a) test()
''' doc ''' class Foo: '我是描述信息' pass class Bar(Foo): pass print(Bar.__doc__) #该属性无法继承给子类
''' call ''' class Foo: def __call__(self, *args, **kwargs): print('实例执行啦 call') f1=Foo() f1() #实例执行啦 call #f1的类Foo 下的__call__
@property @x.setter @x.deleter
class Foo: def __init__(self,val): self.__NAME=val #将所有的数据属性都隐藏起来 @property def name(self): return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置) @name.setter def name(self,value): if not isinstance(value,str): #在设定值之前进行类型检查 raise TypeError('%s must be str' %value) self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME @name.deleter def name(self): #raise TypeError('Can not delete') del self.__NAME f=Foo('egon') print(f.name)