面向对象的基础函数

一:面向对象内置函数

1.str
class Student():
    school = 'SH'
     调用类的时候触发
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def tell(self):
        print('name: %s, age: %s' % (self.name, self.age))

    打印对象的时候, 自动触发的函数
    返回值只能是字符串 其他会报错
    def __str__(self):
        return 'name: %s' % self.name
        return 123   报错
        
        
stu = Student('ly', 20)
print(stu)   相当于 print(stu.__str__())
2.del

class Student():
    school = 'SH'
     调用类的时候触发
    def __init__(self, name, age):
        self.name = name
        self.age = age

    手动执行del,程序执行完毕触发
    def __del__(self):
        return 'name: %s' % self.name


stu = Student('ly', 19)
 指定删除name
del stu.name
print('end=》》》》》')

3.enter__和__exit
1.我们都知道在操作文件对象的时候可以这么写
with open('a.txt') as f:
	代码块

1.上述叫做上下文管理协议,既with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法

class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
         return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')


with Open('a.txt') as f:
    print('=====>执行代码块')
     print(f,f.name)

2.exit()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行

class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')
        print(exc_type)
        print(exc_val)
        print(exc_tb)



with Open('a.txt') as f:
    print('=====>执行代码块')
    raise AttributeError('***着火啦,救火啊***')
print('0'*100) #------------------------------->不会执行

3.如果__exit()返回值为True,那么异常会被清空,就好像啥都没发生过一样,with后的语句正常执行

class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        return True



with Open('a.txt') as f:
    print('=====>执行代码块')
    raise AttributeError('***着火啦,救火啊***')
print('0'*100) ------------------------------->会执行
class Open:
    def __init__(self,filepath,mode='r',encoding='utf-8'):
        self.filepath=filepath
        self.mode=mode
        self.encoding=encoding

    def __enter__(self):
         print('enter')
        self.f=open(self.filepath,mode=self.mode,encoding=self.encoding)
        return self.f

    def __exit__(self, exc_type, exc_val, exc_tb):
        # print('exit')
        self.f.close()
        return True 
    def __getattr__(self, item):
        return getattr(self.f,item)

with Open('a.txt','w') as f:
    print(f)
    f.write('aaaaaa')
    f.wasdf #抛出异常,交给__exit__处理

4.用途或者说好处

1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无需在去关注这个问题,这将有大用处.
posted @ 2021-12-07 22:42  AlexEvans  阅读(47)  评论(0编辑  收藏  举报