网站LOGO
博客 | 棋の小站
页面加载中
12月6日
达尔达尼亚瀑布,博洛尼亚,意大利 ...
网站LOGO 博客 | 棋の小站
记录学习,心得,状态,生活。
菜单
  • 热评
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    Python高级用法2——魔法函数
    点击复制本页地址
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    按住ctrl可打开默认菜单

    Python高级用法2——魔法函数

    · 原创 ·
    学学编程 · Python
    共 4422 字 · 约 4 分钟 · 202

    众所周知,Python有一系列的以__(双下画线)开头和结尾的属性和方法,它们都是Python预先定义好的,具有一定含义的函数。比如__init__(self)就是类在实例化时会执行的方法。但是如果你查看Python源码,就会发现有些类的方法并不止__init__()__str__()__del__()__repr__()。这些函数统称为魔法函数。通过定义魔法函数可以给对象增加许多不需要直接调用方法就可以操作对象的方法,比如让对象相加。下面就一一列举Python中常用的魔法函数。

    类和对象有关

    __init__(self)

    __init__(self)函数在对象实例化后被调用,它的第一个参数通常命名为self,表示对自身对象的引用。一般在这个函数中执行对对象成员变量赋值的操作。

    python 代码:
    class Demo:
        def __init__(self):
            print('对象初始化时调用')
    
    Demo()
    
    # 对象初始化时调用

    __new__(cls, *args, **kwargs)

    __new__(cls, *args, **kwargs)函数在对象初始化时调用,但是此方法不常用。通常情况下在创建不可变对象时需要重写此方法,并在函数体里对对象不可变的变量赋值。

    python 代码:
    class Demo:
        def __new__(cls, *args, **kwargs):
            obj = super().__new__(cls)
            print('创建对象时调用')
            obj.static = None
            return obj
    
        def __init__(self, value=None):
            self.value = value
            print('对象初始化时调用')
    
    
    Demo()
    
    # 创建对象时调用
    # 对象初始化时调用

    __del__(self)

    __del__(self)在对象删除时被调用,一般可用于写入日志、关闭连接、释放资源等操作。

    python 代码:
    class Demo:
        def __init__(self, value=None):
            self.value = value
            print('对象初始化时调用')
    
        def __del__(self):
            print('对象被删除时被调用')
    
    Demo()
    
    # 对象初始化时调用
    # 对象被删除时被调用

    输出有关

    __str__(self)

    __str__(self)返回一个字符串,用于表示对象的可打印版本。通常在调用str()函数或使用print()函数时被自动调用。

    python 代码:
    class Demo:
        def __str__(self):
            return f'<Class Demo at {hex(self.__hash__())}>'
    
    d = Demo()
    print(d)
    
    # <Class Demo at 0x1ac981b499>

    __repr__(self)

    __repr__(self)返回一个字符串,用于表示对象的“官方”字符串表示。通常在调试和开发过程中使用。

    __len__(self)

    __len__(self)返回对象的长度。通常在调用len()函数时被自动调用。

    python 代码:
    class Demo:
        def __init__(self, *args):
            self.list = args
    
        def __str__(self):
            return str(self.list)
    
        def __len__(self):
            return len(self.list)
    
    
    d = Demo(1, 2, 3)
    print(d, len(d))
    
    # (1, 2, 3) 3

    列表、元组属性有关

    1. __iter__(self): 返回一个迭代器对象,用于支持对象的迭代。通常在使用for循环迭代对象时被自动调用。
    2. __next__(self): 在迭代器中,返回下一个值。通常在调用next()函数或使用for循环遍历迭代器时被自动调用。
    3. __contains__(self, item): 用于判断对象是否包含某个元素。通常在使用in关键字来检查对象是否包含某个元素时被自动调用。
    py 代码:
    class Demo:
        def __init__(self, *args):
            self.list = args
    
        def __iter__(self):
            return iter(self.list)
    
        def __contains__(self, item):
            return item in self.list
    
    d = Demo(1, 2, 3)
    for i in d:
        print(i) # 1\n2\n3
    print(1 in d) # True
    print(4 in d) # False

    字典属性有关

    1. __getattr__(self, name): 在属性查找失败时被调用,用于返回指定属性的值。
    2. __setattr__(self, name, value): 在设置对象属性值时被调用。通常用于拦截属性的赋值操作。
    3. __delattr__(self, name): 在删除对象属性时被调用。通常用于拦截属性的删除操作。
    python 代码:
    class Demo:
        def __init__(self, **kwargs):
            self.dict = kwargs
    
        def __setitem__(self, key, value):
            self.dict[key] = value
    
        def __getitem__(self, item):
            return self.dict[item]
    
        def __delitem__(self, key):
            del self.dict[key]
    
        def __str__(self):
            return str(self.dict)
    
    d = Demo(a=1, b=2, c=3)
    print(d['a'])  # 1
    d['b'] = 4
    print(d['b'])  # 4
    del d['c']
    print(d)  # {'a': 1, 'b': 4}

    看到这里相信你也对魔法函数有了一定的了解,以下就只列举出其他的魔法函数,不再给出例子。

    其他魔法函数

    1. __getitem__(self, key): 用于支持通过索引或键访问对象的元素。通常在使用索引或键访问对象时被自动调用。
    2. __setitem__(self, key, value): 用于支持通过索引或键设置对象的元素值。通常在使用索引或键设置对象的元素值时被自动调用。
    3. __delitem__(self, key): 用于支持通过索引或键删除对象的元素。通常在使用索引或键删除对象的元素时被自动调用。
    4. __ne__(self, other): 用于对象的不等性比较。通常在使用!=运算符进行对象间的比较时被自动调用。
    5. __eq__(self, other): 用于对象的相等性比较。通常在使用==运算符进行对象间的比较时被自动调用。
    6. __lt__(self, other): 用于对象的小于比较。通常在使用<运算符进行对象间的比较时被自动调用。
    7. __gt__(self, other): 用于对象的大于比较。通常在使用>运算符进行对象间的比较时被自动调用。
    8. __call__(self, ...): 允许将对象作为函数调用。通过重写__call__方法,我们可以使对象具有函数的行为。
    9. __enter__(self), __exit__(self, exc_type, exc_value, traceback): 用于定义对象在使用 with 语句时的上下文管理器。__enter__ 方法在进入上下文时被调用,__exit__ 方法在离开上下文时被调用。
    10. __add__(self, other): 用于对象的加法操作。通常在使用 + 运算符进行对象间的加法操作时被自动调用。
    11. __sub__(self, other): 用于对象的减法操作。通常在使用 - 运算符进行对象间的减法操作时被自动调用。
    12. __mul__(self, other): 用于对象的乘法操作。通常在使用 * 运算符进行对象间的乘法操作时被自动调用。
    13. __div__(self, other): 用于对象的除法操作。通常在使用 / 运算符进行对象间的除法操作时被自动调用。
    14. __floordiv__(self, other): 用于对象的地板除操作。通常在使用 // 运算符进行对象间的地板除操作时被自动调用。
    15. __mod__(self, other): 用于对象的取模操作。通常在使用 % 运算符进行对象间的取模操作时被自动调用。
    16. __pow__(self, other[, modulo]): 用于对象的指数操作。通常在使用 ** 运算符进行对象间的指数操作时被自动调用。
    声明:本文由 (博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    现在已有

    5

    条评论
    发一条!
    1. 头像
      Fgaoxing
      • 等级:Lv.3
      • 角色:访客
      • 在线:很久之前

      这里讲的不全,应该顺带讲讲真、假私有函数

      · · · 黑龙江-哈尔滨
      1. 头像
        Fgaoxing

        这个云笔记里有就没打算写,我的云笔记感觉Python挺全的

        · · · 辽宁-沈阳
    2. 头像
      阳光下的小宁宁
      • 等级:Lv.2
      • 角色:访客
      • 在线:很久之前

      过来看看! 😀

      · · · 黑龙江-哈尔滨
      1. 头像

        感谢支持!你的博客内容看起来有待进步呢,加油!

        · · · 辽宁-沈阳
        1. 头像
          阳光下的小宁宁
          • 等级:Lv.2
          • 角色:访客
          • 在线:很久之前

          就是没事水一水

          · · · 黑龙江-哈尔滨
    博客logo 博客 | 棋の小站 记录学习,心得,状态,生活。
    ICP 冀ICP备2023007665号 ICP 冀公网安备 13030202003453号

    🕛

    本站已运行 221 天 14 小时 52 分

    👁️

    今日访问量:342 昨日访问量:2564

    🌳

    建站:Typecho 主题:MyLife
    博客 | 棋の小站. © 2023 ~ 2023.
    网站logo

    博客 | 棋の小站 记录学习,心得,状态,生活。
     
     
     
     
    壁纸
     
     
     
     

    5

    2

  • 下一篇