内建方法
__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'}
'''