Python学习笔记4 魔法方法

魔法方法,被双下划线包围,能够在适当的时候被自动调用

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值