面向对象进阶

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))

 

 

 

 


 

posted @ 2017-04-25 20:07  ❀枫舞❀  阅读(143)  评论(0编辑  收藏  举报