• 面向对象进阶


    1,item系列

    把对象操作熟悉模拟成字典的格式

    class Foo:
        def __init__(self,name):
            self.name=name
        def __getitem__(self, item):
            return self.__dict__[item]
        def __setitem__(self, key, value):
            self.__dict__[key]=value
        def __delitem__(self, key):
            self.__dict__.pop(key)
    
    f=Foo('feng')
    print(f['name'])

    2,Python上下文管理器以及with语句

    上下文管理器要实现__enter__和__exit__的特殊方法。

    __enter__(self): 进入上下文管理器时调用此方法,其返回值将被放入with-as语句中as说明符指定的变量中。

    __exit__(self,type,value,tb):离开上下文管理器调用此方法。如果有异常出现,type、value、tb分别为异常的类型、值和追踪信息。如果没有异常,

    3个参数均设为None。此方法返回值为True或者False,分别指示被引发的异常得到了还是没有得到处理。如果返回False,引发的异常会被传递出上下文。

    文件上下文管理协议大概是如下实现的:

    class OpenFile(object):
    
        def __init__(self,filename,mode):
    
            self.filename=filename
    
            self.mode=mode
    
        def __enter__(self):
    
            self.f=open(self.filename,self.mode)
    
            return self.f  #作为as说明符指定的变量的值
    
        def __exit__(self,type,value,tb):
    
            self.f.close()
    
            return False   #异常会被传递出上下文
    
    with OpenFile('my_file.txt','w') as f:
    
        f.write('Hello ')
    
        f.write('World')

    相当于:

    try :
    
        执行__enter__的内容
    
    finally:
    
        执行__exit__的内容


    3,通过__iter__,__next__实现迭代器协议

    class c1:

        def __init__(self,start):

            self.start = start

        def __iter__(self):

            return self

        def next(self):

            self.start += 1

            return self.start

    o1 = c1(10)

    for i in o1:

        print i

    4,构析函数

    import time
    class Open:
        def __init__(self,filepath,mode='r',encode='utf-8'):
            self.f=open(filepath,mode=mode,encoding=encode)
    
        def write(selfself):
            pass
        def __getattr__(self, item):
            return getattr(self.f,item)
        def __del__(self):
            print('del')
            self.f.close()
    f=Open('a.txt','w')
    del f

    上图中的“__del__”就是一个析构函数了,当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。

    __del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数

    如果要显式的调用析构函数,可以使用del关键字,方式如下:
    del对象名

    6,__slots__方法

    
    
    class People:     __slots__=['x','y','z']
    p=People() print(People.__dict__)
    p.x=1 p.y=2 p.z=3 print(p.x,p.y,p.z)
    p1=People() p1.x=10 p1.y=20 p1.z=20 print(p1.x,p1.y,p1.z) # print(p1.__dict__)



    7,元类

    type成为元素,是所有类的类 ,利用type模拟class关键字的创建类的过程

    def run(self):
        print('%s is runing'%self.name)
    
    class_name='Bar'
    bases=(object,)
    class_dic={'x':1,
               'run':run}
    Bar=type(class_name,bases,class_dic)
    print(Bar)
    print(type(Bar))
    
    
    
  • 相关阅读:
    LeetCode No944. 删列造序
    LeetCode No38. 外观数列
    LeetCode No39. 组合总和
    leetcode 643. Maximum Average Subarray I 子数组最大平均数 I
    leetcode 3. Longest Substring Without Repeating Characters 无重复字符的最长子串
    go 的day 10
    mysqlinsert
    oracle sql经验
    数据同步思路
    Redis 扫描scan Anthony
  • 原文地址:https://www.cnblogs.com/fengwu007/p/6764051.html
Copyright © 2020-2023  润新知