python进阶-面向对象编程五:类的内置方法

 类的使用本质是调用类的内置方法

 __getitem__, __setitem__,__delitem__,__delattr__

# __getitem__, __setitem__,__delitem__,__delattr__
# 对象的属性进行获取、修改、删除时候触发的内置方法
class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        self.__dict__[key]=value

    def __delitem__(self, key):
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)

    def __delattr__(self, item):
        print('del obj.key时,我执行')
        self.__dict__.pop(item)

f=Foo("adamander")
print(f.name)
print(f['name'])
f['age']=18
f['age1']=19

print(f['age'])
print(f.age1)
del f.age1
del f['age']

print(f.__dict__)

# 内置方法:__slots__ 

#使用类.xxx,或者对象.xxx,来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的字典是独立的)
#字典会占用大量的内存,如果有一个属性很少的类,但是实例很多的类,用__slots__来代替__dict__,限制对象属性数量,
# 对所有对象属性统一管理,
#节省内存.缺点是不能再给实例添加新属性,只能用里面有的。
class People:
    __slots__ = ['x','y','z']

p=People()
p.x=10
p.y=20
p.z=30
print(p.x,p.y,p.z)

 

#实现迭代器协议的内置方法:__iter__,__next__

#实现迭代器协议的内置方法:__iter__,__next__
from collections import Iterable,Iterator

class Foo:
    def __init__(self,start):
        self.start=start

    def __iter__(self):
        return self

    def __next__(self):
        n=self.start
        self.start+=1
        return n

f=Foo(0)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))


#一直不停的往下加
# for i in f:
#     print(i)


print("************************")

 

# 实现range类,__next__进行StopIteration处理

# 实现range类,__next__进行StopIteration处理
class Range:
    def __init__(self,start,end):
        self.start=start
        self.end=end

    def __iter__(self):
        return self

    def __next__(self):
        if self.start==self.end:
            raise StopIteration
        n=self.start
        self.start+=1
        return n

for i in Range(3, 8):
    print(i)

# r=Range(3,11)
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))
# print(next(r))

 

析构方法___del__

# 析构方法___del__析构方法,当对象在内存中被释放时,自动触发执行。
# 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,
# 因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
#垃圾回收机制,del 立即删除,不然等其他执行完毕,自动回收

import time
class Open:
    def __init__(self,filename,mode='r',encoding='utf-8'):
        self.file=open(filename,mode,encoding=encoding)
    def __enter__(self):
        print("enter=====>")
        return self
    def write(self,line):
        t=time.strftime('%Y-%m-%d %T')
        self.file.write('%s %s' %(t,line))

    def __getattr__(self, item):
        return getattr(self.file,item)
    def __del__(self):
        print("===>del")

    def __exit__(self, exc_type, exc_val, exc_tb):
        # print("exit")
        # print("exc_type",exc_type)
        # print("exc_val",exc_val)
        # print("exc_tb",exc_tb)
        self.file.close()

with Open('b.txt','w+') as f:
    f.write("xxxx")
    f.write("xxxx")
    f.write("xxxx")

  

# __call__实例调用

# __call__实例调用
# __call__实例调用,没有他,实例是不可调用的
class People:
    def __init__(self,name):
        self.name=name
    # def __call__(self, *args, **kwargs):
    #     pass


p=People("ada")
print(callable(People))
#True
print(callable(p))
#False,然而放开注释就是True

 

posted @ 2017-09-13 20:16  Adamanter  阅读(127)  评论(0编辑  收藏  举报