day27面向对象(四)

时间:2022-12-15 13:21:22

 

'''

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