zoukankan      html  css  js  c++  java
  • 第三章魔法函数

    1.什么是魔法函数

    • 魔法函数是以上下划线开头和双下划线结尾的函数:__init__(self){...}
    • 魔法函数是python帮我们定义过的不需要自己定义
    • python可以帮我们自动(隐式)调用魔法函数,不需要自己调用:例如调用__getitem__(self,item)就具有了迭代器属性可以放入for in 循环中遍历
     1 class Company(object):
     2     def __init__(self, employee_list):
     3         self.employee = employee_list
     4 
     5     # python编译器自动调用,使得可以在for in循环中使用
     6     def __getitem__(self, item):
     7         return self.employee[item]
     8 
     9 
    10 company = Company(["tom", "bob", "jane"])
    11 for em in company:
    12     print(em)       # tom bob jane

    2.python的数据模型以及数据模型对python的影响

    • 此处的数据模型也就是常说的魔法函数
    • 如果自己没有实现类中的一些数据模型可能会对python中的遍历,切片等语法产生影响
     1 class Company(object):
     2     def __init__(self, employee_list):
     3         self.employee = employee_list
     4 
     5     # python编译器自动调用,使得可以在for in循环中使用
     6     def __getitem__(self, item):
     7         return self.employee[item]
     8 
     9     # python编译器自动调用,获得长度
    10     # def __len__(self):
    11     #     return len(self.employee)
    12 
    13 
    14 company = Company(["tom", "bob", "jane"])
    15 for em in company:
    16     print(em)       # tom bob jane
    17 
    18 # __getitem__处理切片的数据可以得到len,不可以处理没有切片的数据
    19 company1 = company[:2]
    20 
    21 # 步骤:
    22 # 1.查找否有__len__
    23 # 2.没有__len__再查看数据是否切片并且是否有__getitem__
    24 # 3.有则可以获得len,如果数据没有切片则会报错
    25 print(len(company1))    # 2

    3.魔法函数一览表

    • 非数学运算
      • 字符串:
        • __repr__
        • __str__
      • 集合、序列相关
        • __len__
        • __getitem__
        • __setitem__
        • __delitem__
        • __contains__
      • 迭代相关
        • __iter__
        • __next__
      • 可调用
        • __call__
      • with上下文管理器
        • __enter__
        • __exit__
      • 数值转换
        • __abs__
        • __bool__
        • __int__
        • __float__
        • __hash__
        • __index__
      • 元类相关
        • __new__
        • __init__
      • 属性相关
        • __getattr__、__setattr__
        • __getattribute__、setattribute__
        • __dir__
      • 属性描述符
        • __get__
        • __set__
        • __delete__
      • 协程
        • __await__
        • __aiter__
        • __anext__
        • __aenter__
        • __aexit__
    • 数学运算
      • 一元运算符
        • __neg__(-)、__pos__(+)、__abs__
      • 二元运算符
        • __lt__(<)、__le__(<=)、__eq__(==)、__ne__(!=)、__gt__(>)、__ge__(>=)
        • __add__(+)、__sub__(-)、__mul__(*)、__truediv__(/)、__floordiv__(//)、
      • 算术运算符
      • 反向算术运算符
      • 增量赋值算数运算符
      • 位运算符
      • 反向位运算符
      • 增量赋值位运算符

    编写__str__、__repr__方法

     1 class Company(object):
     2     def __init__(self, employee_list):
     3         self.employee = employee_list
     4 
     5     # 在对象格式化时调用
     6     def __str__(self):
     7         return ",".join(self.employee)
     8 
     9     # 在开发模式下调用
    10     def __repr__(self):
    11         return ",".join(self.employee)
    12 
    13 
    14 company = Company(["tom", "bob", "jane"])
    15 # 对象格式化
    16 print(company)  # tom,bob,jane
    17 # 开发模式:cmd或notebook中调用
    18 company     # tom,bob,jane

    编写__add__方法

     1 class MyVector(object):
     2     def __init__(self, x, y):
     3         self.x = x
     4         self.y = y
     5 
     6     def __add__(self, other):
     7         re_vector = MyVector(self.x + other.x, self.y + other.y)
     8         return re_vector
     9 
    10     def __str__(self):
    11         return "x:{x},y:{y}".format(x=self.x, y=self.y)
    12 
    13 
    14 vec1 = MyVector(1, 2)
    15 vec2 = MyVector(3, 4)
    16 print(vec1 + vec2)  # x:4,y:6
  • 相关阅读:
    Java中Date和Calender类的使用方法
    看《做性能测试需要做些什么》
    【笔记】jquery append,appendTo,prepend,prependTo 介绍
    【实践】jquery实现滑动动画及轮播
    【实践】四联联动 + 更加优化
    【实践】jQuery实现三联联动
    关于导入excel报错的处理(xls,xlsx)
    递归算法及经典案例
    验证身份证真假
    正则表达式
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12073388.html
Copyright © 2011-2022 走看看