Python 对象上下文管理协议

class MyOpen:

    def __init__(self,filename):
        self.filename=filename



    def __enter__(self):
        self.file = open(self.filename, 'r')
        data = self.file.read()
        print(data)

    """ 
        如果 with代码块里面的程序没有异常,则执行with代码块里面的程序后,触发__exit__, 它后面的三个参数都为None;
        如果 with代码块里面的程序发生异常, 则在发生异常的位置 触发触发__exit__,它后面的三个参数都不为None,分别代表着三个异常信息
            如果返回True,则代表吞掉异常,with代码块外面的程序继续执行
            如果返回False,或不返回任何信息,则抛出异常
    """
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
        print('__exit__')
        return True




with MyOpen('config.txt') as f:
    print(6/0)

print(666)

 

 

 利用描述符来限定对象属性的类型

class Typed:

    def __init__(self,key,type):
        self.key=key
        self.type=type

    def __get__(self, instance, owner):
        print('__get__')
        return instance.__dict__[self.key]

    def __set__(self, instance, value):
        print('__set__')
        if type(value) is self.type:
            instance.__dict__[self.key]=value
        else:
            raise TypeError('属性【%s】的类型必须是%s'%(self.key,self.type))


    def __delete__(self, instance):
        print('__delete__')
        del instance.__dict__[self.key]


class People:

    name=Typed('name',str)
    age=Typed('age',int)
    salary=Typed('salary',float)

    def __init__(self,name,age,salary):
        self.name=name
        self.age=age
        self.salary=salary


p=People('jack',23,1234)
print(p.name)

 

posted @ 2020-11-30 21:55  leungqingyun  阅读(50)  评论(0)    收藏  举报