面向对象的高阶用法

class Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        #必须有返回值,且必须返回字符串类型
        return '<name:%s age:%s>' %(self.name,self.age)
obj=Foo('bao',12)
print(obj)

del

class Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __del__(self):#析构方法
        print("del---->")   #程序运行结束后,内存释放,会执行del方法。
obj=Foo('bao',12)
print("========>>")   #先执行print。在执行del

下面这三个以后用于 接口。

class Foo:
    def __init__(self,name):
        self.name=name
    def __getitem__(self, item):
        print("getitem")
        return self.__dict__[item]
    def __setitem__(self, key, value):  #修改
        print("setitem",key,value)
        self.__dict__[key]=value
    def __delitem__(self, key):     #删除
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)
obj=Foo('egon')
# obj.name='bao66'
# print(obj.name)

obj['name'] = 'bao66'
# print(obj.name)
del obj['name']
print(obj.__dict__)
#加上item方法,则无需判断obj的类型,不管是dict类型还是Foo类型,都以统一的一种[]的方式操作
def func(obj,key,value):
    obj[key]=value #obj['name']='123123'

dic={'name':'egon','age':18}
obj=Foo('egon')
print(obj.__dict__)

attr系列

class Foo:
    def __init__(self,x):
        self.x=x  #初始化
    def __getattr__(self, item):   #属性没有的时候触发getattr
        print("getattr")

    def __setattr__(self, key, value):   #设置的时候触发
        # print("setattr")
        self.__dict__[key]=value   #实例化 否则print打印为空
    def __delattr__(self, item):    #执行del的时候触发delattr
        print("delattr")
        self.__dict__.pop(item)

obj=Foo(10)
obj.x=1
obj.c=2
obj.d=3
print(obj.__dict__)
del obj.c

print(obj.__dict__)
结果
{'c': 2, 'x': 1, 'd': 3}
delattr
{'x': 1, 'd': 3}

二次加工

class List(list):
    """
    功能描述 第一字列表的添加append,第二取中间数//2,第三清空list
    """
    def __init__(self,item,tag=False):
        super().__init__(item)
        self.tag=tag
    def append(self, p_object):
        if not  isinstance(p_object,str):
            raise TypeError('%s must be str' %p_object)
        super(List,self).append(p_object)
    @property
    def mid(self):
        mid_index=len(self)//2
        return mid_index
    def clear(self):
        if not self.tag:
            raise PermissionError('not  permissive')
        super().clear()
        self.tag=False

bao = List([1,2,3,4,5])
print(bao)
bao.append('6')
print(bao)
print(bao.mid)

授权  重写open

import time
class Open:
    def __init__(self,filepath,mode='r',encoding='utf-8'):
        self.filepath=filepath
        self.mode=mode
        self.encoding=encoding
        self.f = open(self.filepath,mode=self.mode,encoding=self.encoding)
    def write(self,msg):
        t=time.strftime('%Y-%m-%d %X')
        self.f.write('%s %s\n' %(t,msg))
    def __getattr__(self,item):
        return getattr(self.f,item)

obj=Open('a.txt','w+',encoding='utf-8')
obj.write('111111111\n')
obj.write('22222222\n')
obj.write('333333333333\n')


obj.seek(0) #
print(obj.read())  #self.f.read()
obj.close()  #self.f.close()

上下文管理协议

class Open:
    def __init__(self, name,mode='r',encoding='utf-8'):
        self.name = name
        self.mode=mode
        self.encoding=encoding
        self.f=open(self.name,mode=self.mode,encoding=self.encoding)
    def __enter__(self):
        # print('__enter__')
        return self.f

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

# obj=Open('b.txt','w')
# print(obj)



with Open('c.txt','w') as f: #f=self.f
    print(f)
    1/0
    print('===>')
    f.write('11111\n')
    f.write('22222\n')

print('=======>with以外的代码')

 

posted @ 2017-06-19 12:26  Sober--Never  阅读(110)  评论(0)    收藏  举报