python 面向对象内建方法

内建方法

__slots__


介绍

__slots__是一个类的变量 
如果一个类需要大量的实例化 ,而属性又不需要变化的话可以使用__slots__来节省内存
__slots__可以是元组也可以是列表
使用__slots__以后这个类仅能够拥有__slots__内所包含的元素的属性

使用例子

class people:
    __slots__ = ['x','y']
p = people()
p.x = 1
p.y = 1
p.z = 1 #执行到这一步会报错,因为__slots__内不包含[z]
print(p.__slots__) #通过__slots__可以显示slots变量

__iter__,__next__


iter介绍

__iter__这个内建方法用来声明类是一个可迭代对象
通过__iter__可以返回一个迭代器

next介绍

__next__能在外部代码迭代该对象时,返回一个值

使用例子

利用__iter__和__next__模仿python内置函数写一个range
class Range:
    def __init__(self,start,end):
        self.start,self.end = start,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 x in Range(1,10):
    print(x)

__del__

介绍

删除对象时会执行__del__方法里面的代码

例子

class Open:
    def __init__(self,filepath,md = 'r',ec = 'utf-8'):
        self.file_rw = open(filepath, mode=md, encoding = ec)
    def __getattr__(self,item):
        return  getattr(self.file_rw,item)
    def __del__(self):
        print("del")
        self.file_rw.close()
f = Open("a.txt", md='w', ec='utf-8')
del f

__enter__,__exit__

介绍

__enter__和__exit__用来上下文管理,使对象兼容with语句
其中__exit__中传入三个参数分别是[异常类型][异常内容][异常追踪]
如果发生程序在with代码块里面发生异常,程序就不会执行with代码块下面的代码了
但要是__exit__方法返回True就会自动清空异常,继续执行with代码块外部的代码

举个open()例子

class Open:
    def __init__(self,filepath,md = 'r',ec = 'utf-8'):
        self.file_rw = open(filepath, mode=md, encoding = ec)
    def __enter__(self):
        print("enter")
        return self
    def write(self,line):
        print("writting")
        line = str(line)
        self.file_rw.write(line + '\n')
    def __getattr__(self,item):
        return  getattr(self.file_rw,item)
    def __exit__(self,exc_type,exc_val,exc_tb):
        print("del")
        self.file_rw.close()
        return True
with Open("a.txt", md='w', ec='utf-8') as f:
    for x in range(1,10):
        f.write(x)
''' output
enter
writting
writting
writting
writting
writting
writting
writting
writting
writting
del
'''

__call__

直接在对象后面加括号就可以执行,__call__这个内建方法
对象()或者类()()
class foo:
    def __call__(self,*args,**kwargs):
        print("call")
p = foo()
p()
''' output:
call
'''

利用type建立一个类

介绍

type是python内部建立的一个元类
   class关键字定义的时候靠的就是type元类
class定义好后会作为一个对象传到元类里

例子

def run(self):
    print("%s is running" %self.name)
class_name = "Bar"
class_dic={
    'x':1,
    'run':run
}
base = (object,)
my_bar = type(class_name,base,class_dic)
print(my_bar)
'''output
<class '__main__.Bar'>
'''

元类

介绍

元类用来控制类的创建
如果不指定元类,默认的元类就是type

例子

class Mytype(type):
    def __init__(self,what,bases=None,dict=None):
        print(what,bases,dict)

    def __call__(self, *args, **kwargs):
        print('--->')
        obj=object.__new__(self)
        self.__init__(obj,*args,**kwargs)
        return obj
class Room(metaclass=Mytype):
    def __init__(self,name):
        self.name=name

r1=Room('aaaccc')
print(r1.__dict__)
''' output:
Room () {'__module__': '__main__', '__init__': <function Room.__init__ at 0x2222222>, '__qualname__': 'Room'}
--->
{'name': 'aaaccc'}
'''

Leave a Reply

Your email address will not be published. Required fields are marked *