魔法方法,被双下划线包围,能够在适当的时候被自动调用
1.算数魔法方法
init魔法方法 init返回的是none
new魔法方法 def __new__(class,parameter): ##继承的类是不可修改的,而在实例化对象时需要可以修改,返回结果是实例对象
eg class Classname(type): #继承type,但是要对type进行改造时只能通过new方法实现
def __new__(cls,parameter):
parameter = parameter.functionname()
return type.__new__(cls,parameter)
删除魔法方法 def __del__(self):
调用 del objectname ###只有当最后一个实例对象进行del操作时,才会调用该方法
加法魔法方法+ def __add__(self,other):
return type.__add__(self,other)
减法魔法方法- def __sub__(self,other):
return type.__sub__(self,other)
乘法魔法方法* def __mul__(self,other):
return type.__mul__(self,other)
除法魔法方法/ def __truediv__(slef,other):
return type.__truediv__(self,other)
整数除法魔法方法// def __floordiv__(self,other):
return type.__floordiv__(self,other)
取余魔法方法% def __mod__(sef,other):
return type.__mod__(self,other)
幂运算魔法方法** def __pow__(self,other):
return type.__pow__(self,other)
调用 objectname1 = Classname(a)
objectname2 = Classname(b)
objectname1 +-*/等 objectname2
按位左移魔法方法<< def __lshift__(self,other):
return type.__lshift__(self,other)
按位右移魔法方法>> def __rshift__(self,other):
return type.__rshift__(self,other)
按位与魔法方法& def __and__(self,other):
return type.__and__(self,other)
按位或魔法方法^ def __or__(self,other):
return type.__or__(self,other)
反运算 def __rname__(self,other): ##当第一个变量无法执行运算方法,则找第二个变量去执行相应的反运算方法
增量赋值方法 运算符= def __iname__(self,other):
正号魔法方法 def __neg__(self):
负号魔法方法 def __pos__(self):
绝对值魔法方法 def __abs__(self):
按位取反魔法方法 def __invert__(self):
输入对象名打印字符串 def __repr__(self):
return self.prompt
print(objectname)打印字符串 def __str__(self):
return self.prompt
2.属性魔法方法
访问属性 def __getattribute__(self,attribute):
return super().__getattribute__(attribute)
访问的属性不存在 def __getattr__(self,attribute):
使用 objectname.attribute
设置属性 def __setattr__(self,attribute,value):
if attribute == ' ':
elif attribute == ' ':
super().__setattr__(attribute,value)
else:
print('输入的属性有误,请重新输入')
使用 objectname.attribute =
删除属性 def __delattr__(self,attribute):
super().__deattr__(attribute)
使用 del objectname.attribute
3.描述符
描述符 将某种特殊类型的类的实例指派给另一个类的属性
class Classname1:
def __init__(self,fget,fset,fdel):
self.fget = fget
self.fset = fset
self.del = fdel
获取 def __get__(self,instace,owner): ##其中self是Classname1,instance是objectname,owner是Classname1
return self.fget(instance)
设置 def __set__(self,instance,value):
self.fset(instance,value)
删除 def __delete__(self,instance):
self.fdel(instance)
使用 class Classname2:
variable = Classname1(getfunction,setfunction,delfunction)
objectname = Classname2
eg
class Celsius:
def __get__(self,instance,owner):
return self.temp
def __set__(self,instance,value):
self.temp = value
class Fahrenheit:
def __get__(self,instance,owner):
return instance.cel *1.8 + 32
def __set__(self,instance,value):
instance.cel = (value - 32)//1.8
class Temp:
cel = Celsius()
fah = Fahrenheit()
4.容器
定制容器是不可变的需要定义__len__()和__getitem__()
可变的需要定义__len__(),__getitem__(),__setitem__()和__delitem__()
返回容器的个数 def __len__(self):
return len(self.listname)
获取容器中的元素 def __getitem__(self,key):
return self.listname[key]
设置容器中的元素 def __setitem__(self,key,value):
self.listname[key] = value
删除容器中的元素 def __delitem__(self,key):
del self.listname[key]
eg class Count:
def __init__(self,*args):
self.list = [x for x in args]
self.count = {}.fromkeys(range(len(self.list)),0)
def __len__(self):
return len(self.list)
def __getitem__(self,key):
self.count[key] += 1
return self.list[key]
def __setitem__(self,key,value):
self.list[key] = value
5.迭代器生成器
迭代器 variable = iter(str/list/tuple)
调用 next(variable) #得到第一个元素,继续调用得到下一个元素
魔法方法
def __init__(self,n):
self.name1 =
self.name2 =
self.n = n ##设置迭代上限
def __iter__(self):
return self
def __next__(self):
self.name1,self.name2 = ,
if self.name > self. n:
raise StopIteration ##异常提示
return self.name
生成器是迭代器函数,可以暂停和挂起,在函数后加yield,相当于函数的return,暂停在yield处。
def generatename():
yield str/list/int
yield
调用 variable = generatename()
next(variable)
列表推导式 listname = [i for i in range(a) if 条件]
字典推导式 dicname = {i: for i in range(a)}
集合推导式 setname = {i for i in list}
生成器推导式 generate = (i for i in range(a) if 条件)
next(generate)