''' 授权 授权是包装的一个特性,包装一个类型通常是对已经存在的类型的一些定制,这种做法可以新建 修改或删除原有产品的功能,其他的则保持原样 授权的过程,及时所有更新的功能都是由新类的某部分来 处理,但已存在的功能就授权给对象的默认属性 __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
')
迭代器
'''
迭代器
'''
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)