草根学Python(十)Python 的 Magic Method

基于Python3.6的草根学Python入门教程设计源码 这是一个基于Python3.6的草根学Python入门教程设计,使用Python语言开发,包含168个文件。主要文件类型包括87个Markdown文档、50个Python源文件、20个XML文件、5个IJI文件、2个JSON文件、2个PNG图片文件、1个gitignore文件和1个Python字节码文件。该项目适合用于个人学习和实践Python的开发技术。 立即下载

前言

距离上一篇已经三个多星期了,最近比较累,下班回到家,很早就休息了,所以更新的进度有点慢。

目录

草根学Python(十) Python 的 Magic Method

一、Python 的 Magic Method

在 Python 中,所有以 “__” 双下划线包起来的方法,都统称为”魔术方法”。比如我们接触最多的 __init__ 。魔术方法有什么作用呢?

使用这些魔术方法,我们可以构造出优美的代码,将复杂的逻辑封装成简单的方法。

那么一个类中有哪些魔术方法呢?

我们可以使用 Python 内置的方法 dir() 来列出类中所有的魔术方法.示例如下:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    pass


if __name__ == '__main__':
    print(dir(User()))

输出的结果:

Python 类的魔术方法

可以看到,一个类的魔术方法还是挺多的,截图也没有截全,不过我们只需要了解一些常见和常用的魔术方法就好了。

二、构造(__new__)和初始化(__init__)

通过上一篇的内容,我们已经知道定义一个类时,我们经常会通过 __init__(self) 的方法在实例化对象的时候,对属性进行设置。比如下面的例子:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __init__(self, name, age):
        self.name = name;
        self.age = age;

user=User('两点水',23)

实际上,创建一个类的过程是分为两步的,一步是创建类的对象,还有一步就是对类进行初始化。__new__ 是用来创建类并返回这个类的实例, 而__init__ 只是将传入的参数来初始化该实例.__new__ 在创建一个实例的过程中必定会被调用,但 __init__ 就不一定,比如通过pickle.load 的方式反序列化一个实例时就不会调用 __init__ 方法。

Python类创建的过程

def __new__(cls) 是在 def __init__(self) 方法之前调用的,作用是返回一个实例对象。还有一点需要注意的是:__new__ 方法总是需要返回该类的一个实例,而 __init__ 不能返回除了 None 的任何值

具体的示例:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __new__(cls, *args, **kwargs):
        # 打印 __new__方法中的相关信息
        print('调用了 def __new__ 方法')
        print(args)
        # 最后返回父类的方法
        return super(User, cls).__new__(cls)

    def __init__(self, name, age):
        print('调用了 def __init__ 方法')
        self.name = name
        self.age = age


if __name__ == '__main__':
    usr = User('两点水', 23)

看看输出的结果:

调用了 def __new__ 方法
('两点水', 23)
调用了 def __init__ 方法

通过打印的结果来看,我们就可以知道一个类创建的过程是怎样的了,先是调用了 __new__ 方法来创建一个对象,把参数传给 __init__ 方法进行实例化。

其实在实际开发中,很少会用到 __new__ 方法,除非你希望能够控制类的创建。通常讲到 __new__ ,都是牵扯到 metaclass(元类)的。

当然当一个对象的生命周期结束的时候,析构函数 __del__ 方法会被调用。但是这个方法是 Python 自己对对象进行垃圾回收的。

三、属性的访问控制

之前也有讲到过,Python 没有真正意义上的私有属性。然后这就导致了对 Python 类的封装性比较差。我们有时候会希望 Python 能够定义私有属性,然后提供公共可访问的 get 方法和 set 方法。Python 其实可以通过魔术方法来实现封装。

方法说明
__getattr__(self, name)该方法定义了你试图访问一个不存在的属性时的行为。因此,重载该方法可以实现捕获错误拼写然后进行重定向, 或者对一些废弃的属性进行警告。
__setattr__(self, name, value)定义了对属性进行赋值和修改操作时的行为。不管对象的某个属性是否存在,都允许为该属性进行赋值.有一点需要注意,实现 __setattr__ 时要避免”无限递归”的错误,
__delattr__(self, name)__delattr__ 与 __setattr__ 很像,只是它定义的是你删除属性时的行为。实现 __delattr__ 是同时要避免”无限递归”的错误
__getattribute__(self, name)__getattribute__ 定义了你的属性被访问时的行为,相比较,__getattr__ 只有该属性不存在时才会起作用。因此,在支持 __getattribute__的 Python 版本,调用__getattr__ 前必定会调用 __getattribute__``__getattribute__ 同样要避免”无限递归”的错误。

通过上面的方法表可以知道,在进行属性访问控制定义的时候你可能会很容易的引起一个错误,可以看看下面的示例:

def __setattr__(self, name, value):
    self.name = value
    # 每当属性被赋值的时候, ``__setattr__()`` 会被调用,这样就造成了递归调用。
    # 这意味这会调用 ``self.__setattr__('name', value)`` ,每次方法会调用自己。这样会造成程序崩溃。

def __setattr__(self, name, value):
    # 给类中的属性名分配值
    self.__dict__[name] = value  
    # 定制特有属性

上面方法的调用具体示例如下:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __getattr__(self, name):
        print('调用了 __getattr__ 方法')
        return super(User, self).__getattr__(name)

    def __setattr__(self, name, value):
        print('调用了 __setattr__ 方法')
        return super(User, self).__setattr__(name, value)

    def __delattr__(self, name):
        print('调用了 __delattr__ 方法')
        return super(User, self).__delattr__(name)

    def __getattribute__(self, name):
        print('调用了 __getattribute__ 方法')
        return super(User, self).__getattribute__(name)


if __name__ == '__main__':
    user = User()
    # 设置属性值,会调用 __setattr__
    user.attr1 = True
    # 属性存在,只有__getattribute__调用
    user.attr1
    try:
        # 属性不存在, 先调用__getattribute__, 后调用__getattr__
        user.attr2
    except AttributeError:
        pass
    # __delattr__调用
    del user.attr1

输出的结果:

调用了 __setattr__ 方法
调用了 __getattribute__ 方法
调用了 __getattribute__ 方法
调用了 __getattr__ 方法
调用了 __delattr__ 方法

四、对象的描述器

一般来说,一个描述器是一个有“绑定行为”的对象属性 (object attribute),它的访问控制被描述器协议方法重写。这些方法是 __get__(), __set__() , 和 __delete__() 。有这些方法的对象叫做描述器。

默认对属性的访问控制是从对象的字典里面 (__dict__) 中获取 (get) , 设置 (set) 和删除 (delete) 。举例来说, a.x 的查找顺序是, a.__dict__['x'] , 然后 type(a).__dict__['x'] , 然后找 type(a) 的父类 ( 不包括元类 (metaclass) ).如果查找到的值是一个描述器, Python 就会调用描述器的方法来重写默认的控制行为。这个重写发生在这个查找环节的哪里取决于定义了哪个描述器方法。注意, 只有在新式类中时描述器才会起作用。在之前的篇节中已经提到新式类和旧式类的,有兴趣可以查看之前的篇节来看看,至于新式类最大的特点就是所有类都继承自 type 或者 object 的类。

在面向对象编程时,如果一个类的属性有相互依赖的关系时,使用描述器来编写代码可以很巧妙的组织逻辑。在 Django 的 ORM 中,models.Model中的 InterField 等字段, 就是通过描述器来实现功能的。

我们先看下下面的例子:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __init__(self, name='两点水', sex='男'):
        self.sex = sex
        self.name = name

    def __get__(self, obj, objtype):
        print('获取 name 值')
        return self.name

    def __set__(self, obj, val):
        print('设置 name 值')
        self.name = val


class MyClass(object):
    x = User('两点水', '男')
    y = 5


if __name__ == '__main__':
    m = MyClass()
    print(m.x)

    print('\n')

    m.x = '三点水'
    print(m.x)

    print('\n')

    print(m.x)

    print('\n')

    print(m.y)

输出的结果如下:

获取 name 值
两点水


设置 name 值
获取 name 值
三点水


获取 name 值
三点水


5

通过这个例子,可以很好的观察到这 __get__() 和 __set__() 这些方法的调用。

再看一个经典的例子

我们知道,距离既可以用单位”米”表示,也可以用单位”英尺”表示。
现在我们定义一个类来表示距离,它有两个属性: 米和英尺。

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-


class Meter(object):
    def __init__(self, value=0.0):
        self.value = float(value)

    def __get__(self, instance, owner):
        return self.value

    def __set__(self, instance, value):
        self.value = float(value)


class Foot(object):
    def __get__(self, instance, owner):
        return instance.meter * 3.2808

    def __set__(self, instance, value):
        instance.meter = float(value) / 3.2808


class Distance(object):
    meter = Meter()
    foot = Foot()


if __name__ == '__main__':
    d = Distance()
    print(d.meter, d.foot)
    d.meter = 1
    print(d.meter, d.foot)
    d.meter = 2
    print(d.meter, d.foot)

输出的结果:

0.0 0.0
1.0 3.2808
2.0 6.5616

在上面例子中,在还没有对 Distance 的实例赋值前, 我们认为 meter 和 foot 应该是各自类的实例对象, 但是输出却是数值。这是因为 __get__ 发挥了作用.

我们只是修改了 meter ,并且将其赋值成为 int ,但 foot 也修改了。这是 __set__ 发挥了作用.

描述器对象 (Meter、Foot) 不能独立存在, 它需要被另一个所有者类 (Distance) 所持有。描述器对象可以访问到其拥有者实例的属性,比如例子中 Foot 的 instance.meter 。

五、自定义容器(Container)

经过之前编章的介绍,我们知道在 Python 中,常见的容器类型有: dict, tuple, list, string。其中也提到过可容器和不可变容器的概念。其中 tuple, string 是不可变容器,dict, list 是可变容器。 可变容器和不可变容器的区别在于,不可变容器一旦赋值后,不可对其中的某个元素进行修改。当然具体的介绍,可以看回之前的文章,有图文介绍。

那么这里先提出一个问题,这些数据结构就够我们开发使用吗?不够的时候,或者说有些特殊的需求不能单单只使用这些基本的容器解决的时候,该怎么办呢?

这个时候就需要自定义容器了,那么具体我们该怎么做呢?

功能说明
自定义不可变容器类型需要定义 __len__ 和 __getitem__ 方法
自定义可变类型容器在不可变容器类型的基础上增加定义 __setitem__ 和 __delitem__
自定义的数据类型需要迭代需定义 __iter__
返回自定义容器的长度需实现 __len__(self)
自定义容器可以调用 self[key] ,如果 key 类型错误,抛出TypeError ,如果没法返回key对应的数值时,该方法应该抛出ValueError需要实现 __getitem__(self, key)
当执行 self[key] = value 时调用是 __setitem__(self, key, value)这个方法
当执行 del self[key] 方法其实调用的方法是 __delitem__(self, key)
当你想你的容器可以执行 for x in container: 或者使用 iter(container) 时需要实现 __iter__(self) ,该方法返回的是一个迭代器

来看一下使用上面魔术方法实现 Haskell 语言中的一个数据结构:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class FunctionalList:
    ''' 实现了内置类型list的功能,并丰富了一些其他方法: head, tail, init, last, drop, take'''

    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values

    def __len__(self):
        return len(self.values)

    def __getitem__(self, key):
        return self.values[key]

    def __setitem__(self, key, value):
        self.values[key] = value

    def __delitem__(self, key):
        del self.values[key]

    def __iter__(self):
        return iter(self.values)

    def __reversed__(self):
        return FunctionalList(reversed(self.values))

    def append(self, value):
        self.values.append(value)

    def head(self):
        # 获取第一个元素
        return self.values[0]

    def tail(self):
        # 获取第一个元素之后的所有元素
        return self.values[1:]

    def init(self):
        # 获取最后一个元素之前的所有元素
        return self.values[:-1]

    def last(self):
        # 获取最后一个元素
        return self.values[-1]

    def drop(self, n):
        # 获取所有元素,除了前N个
        return self.values[n:]

    def take(self, n):
        # 获取前N个元素
        return self.values[:n]

六、运算符相关的魔术方法

运算符相关的魔术方法实在太多了,j就大概列举下面两类:

1、比较运算符

魔术方法说明
__cmp__(self, other)如果该方法返回负数,说明 self < other; 返回正数,说明 self > other; 返回 0 说明 self == other。强烈不推荐来定义 __cmp__ , 取而代之, 最好分别定义 __lt__, __eq__ 等方法从而实现比较功能。 __cmp__ 在 Python3 中被废弃了。
__eq__(self, other)定义了比较操作符 == 的行为
__ne__(self, other)定义了比较操作符 != 的行为
__lt__(self, other)定义了比较操作符 < 的行为
__gt__(self, other)定义了比较操作符 > 的行为
__le__(self, other)定义了比较操作符 <= 的行为
__ge__(self, other)定义了比较操作符 >= 的行为

来看个简单的例子就能理解了:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class Number(object):
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        print('__eq__')
        return self.value == other.value

    def __ne__(self, other):
        print('__ne__')
        return self.value != other.value

    def __lt__(self, other):
        print('__lt__')
        return self.value < other.value

    def __gt__(self, other):
        print('__gt__')
        return self.value > other.value

    def __le__(self, other):
        print('__le__')
        return self.value <= other.value

    def __ge__(self, other):
        print('__ge__')
        return self.value >= other.value


if __name__ == '__main__':
    num1 = Number(2)
    num2 = Number(3)
    print('num1 == num2 ? --------> {} \n'.format(num1 == num2))
    print('num1 != num2 ? --------> {} \n'.format(num1 == num2))
    print('num1 < num2 ? --------> {} \n'.format(num1 < num2))
    print('num1 > num2 ? --------> {} \n'.format(num1 > num2))
    print('num1 <= num2 ? --------> {} \n'.format(num1 <= num2))
    print('num1 >= num2 ? --------> {} \n'.format(num1 >= num2))

输出的结果为:

__eq__
num1 == num2 ? --------> False 

__eq__
num1 != num2 ? --------> False 

__lt__
num1 < num2 ? --------> True 

__gt__
num1 > num2 ? --------> False 

__le__
num1 <= num2 ? --------> True 

__ge__
num1 >= num2 ? --------> False 

2、算术运算符

魔术方法说明
__add__(self, other)实现了加号运算
__sub__(self, other)实现了减号运算
__mul__(self, other)实现了乘法运算
__floordiv__(self, other)实现了 // 运算符
___div__(self, other)实现了/运算符. 该方法在 Python3 中废弃. 原因是 Python3 中,division 默认就是 true division
__truediv__(self, other)实现了 true division. 只有你声明了 from __future__ import division 该方法才会生效
__mod__(self, other)实现了 % 运算符, 取余运算
__divmod__(self, other)实现了 divmod() 內建函数
__pow__(self, other)实现了 ** 操作. N 次方操作
__lshift__(self, other)实现了位操作 <<
__rshift__(self, other)实现了位操作 >>
__and__(self, other)实现了位操作 &
__or__(self, other)实现了位操作 `
__xor__(self, other)实现了位操作 ^

最后,如果对本文感兴趣的,可以关注下公众号:

公众号

PX4固件下VTOL固定翼的3种起飞方式对比:手抛vs弹射vs跑道 本文深度解析PX4固件下VTOL固定翼的三种起飞方式:手抛、弹射与跑道起飞,对比其技术差异与适用场景。通过详细的参数配置和工程实践指南,帮助开发者优化起飞性能,提升无人机在不同环境下的适应性和可靠性。文章特别针对PX4飞控系统的最新特性进行了技术探讨。 阅读详情

相关推荐

STM32实现webserver显示数据及配置参数

其实提到的将fsdata.c重命名为fsdata_custom.c,可以不重命令,将/LWIP/Target/lwipopts.h中HTTPD_USE_CUSTOM_FSDATA 定义为0,这样HTTPD_FSDATA_FILE将使用fsdata.c,避免每次生成fsdata.c需要重命令的麻烦。2、登录成功后,板卡根据板卡配置类型,返回对应的数据页面,该页面可实现数据校准、清零,以及进行到板卡参数设置页面。目前还未实现post功能以及http身份验证功能。3、板卡参数设置页面。

2693

python类:magic魔术方法

http://blog.youkuaiyun.com/pipisorry/article/details/50708812魔术方法是面向对象Python语言中的一切。它们是你可以自定义并添加“魔法”到类中的特殊方法。它们被双下划线环绕(比如__init__或__lt__)。在Python中,我们可以通过”魔术方法”使自定义的class变得强大、易用。例如当我们想定义一个可迭代的类对象的时候,就可以去实现”__

皮皮blog 8152

rv1126 SDK编译【2020-0912版本SDK包】

rv1126 sdk 编译

学习记录 1万+

Python 的 Magic Method

Python 的 Magic Method 目录 一、Python 的 Magic Method 在 Python 中,所有以 “” 双下划线包起来的方法,都统称为"魔术方法"。比如我们接触最多的 init__ 。魔术方法有什么作用呢? 使用这些魔术方法,我们可以构造出优美的代码,将复杂的逻辑封装成简单的方法。 那么一个类中有哪些魔术方法呢? 我们可以使用 Python 内置的方法 dir() 来列出类中所有的魔术方法.示例如下: #!/usr/bin/env python3 # -*- coding:

qq_42992919的博客 451

别再折腾老教程了!树莓派4B/5最新系统(Raspberry Pi OS Bookworm)红外遥控配置,用gpio-ir驱动一次成功

本文详细介绍了树莓派4B/5在最新Raspberry Pi OS Bookworm系统下配置红外遥控的完整指南,摒弃过时的lirc-rpi驱动,采用现代gpio-ir驱动方案。从硬件连接到软件配置,提供10分钟快速上手指南,涵盖驱动加载、信号测试、按键映射及高级应用场景,帮助用户高效完成红外遥控配置。

weixin_42520909的博客 442

关于旋转矩阵的左乘与右乘问题

最近在阅读框架源码时被旋转矩阵左乘右乘绕的云里雾里,故写下一篇记录一下,以防自己不长记性。

菜鸡正在学习 1万+

Python 魔术方法(Magic Method)

介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,例如类的初始化方法 __init__,Python中所有的魔术方法均在官方文档中有相应描述,但是对于官方的描述比较混乱而且组织比较松散。很难找到有一个例子。 构造和初始化 每个Pythoner都知道一个最基本的魔术方法, __init__ 。通过此方法我们可以定义一个对象

ZHAICAN的专栏 1235

GLM-5.2模型自部署实战:如何通过量化与vLLM优化实现远超官方API的推理速度

在大模型应用开发中,模型推理速度是影响用户体验和系统性能的核心指标。其原理在于通过优化计算图、内存管理和并行计算来提升吞吐量与降低延迟。技术价值体现在能够为高并发、低延迟的实时应用提供稳定高效的AI服务能力,广泛应用于智能客服、代码生成、内容创作等场景。其中,模型量化通过降低权重精度(如INT4/INT8)来大幅减少显存占用和计算量,而推理引擎(如vLLM)则通过连续批处理和PagedAttention等技术最大化硬件利用率。本文聚焦于GLM-5.2模型,详细阐述如何通过量化技术与vLLM推理引擎的深度优化

weixin_29032337的博客 319

Python 中的魔术方法(Magic Methods)

LIYINGU的博客 1199

避开这些坑!智鼎MAP性格测试高分指南(附互联网/国企/外企答题模板)

本文深入解析智鼎MAP职业性格测试的核心逻辑与常见陷阱,提供针对互联网、国企、外企三大行业的差异化答题策略与实战模板。帮助求职者理解测试本质,避开追求完美人设、忽视程度副词等心理陷阱,塑造与目标岗位高度匹配的职业画像,从而在招聘关键环节脱颖而出。

rainy的博客 989

PCL1.12.1+VTK9.1+Qt5.14.2实战:解决QVTKOpenGLNativeWidget点云渲染窗口初始化报错问题

本文针对PCL1.12.1、VTK9.1与Qt5.14.2集成开发中,QVTKOpenGLNativeWidget点云渲染窗口初始化时出现的报错与黑屏问题,提供了深度分析与两种实战解决方案。核心在于理解VTK版本升级导致的渲染窗口类型不匹配,并指导开发者通过显式创建vtkGenericOpenGLRenderWindow或利用窗口ID嵌入,正确初始化并绑定可视化组件,从而稳定实现点云渲染。

weixin_29284657的博客 221

Python魔术方法

所有以双下划线__包起来的方法,统称为,它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以执行。魔术方法在类或对象的某些事件出发后会自动执行,让类具有神奇的“魔力”。如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些方法进行重写。

5952

手把手教你学 AI芯片 SOC软件开发专栏简介

在AI芯片(如NPU、GPU加速器)爆发式增长的今天,软件栈开发已成为AI应用落地的核心瓶颈。无论是模型推理加速、低延迟部署,还是能效优化,都依赖于对芯片底层软件的深度掌握。然而,许多开发者困于“只会调用API,不懂驱动实现”的困境,导致性能瓶颈难以突破。本专栏《手把手教你学 AI芯片 SOC软件开发》专为AI工程师、嵌入式开发者及系统架构师打造,从零基础切入,系统拆解AI芯片SOC(System on Chip)的完整软件栈,覆盖Runtime(运行时)

MHD0815的博客 170

草根学Python(一)第一个Python程序

前言 一时冲动,就开始把 Python 的知识点做个总结归纳了。gitbook 同时更新。 目录 草根学 Python(一) 第一个 Python 程序 一、Python 简介 Python 是著名的“龟叔” Guido van Rossum 在 1989 年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。牛人就是牛人,为了打发无聊时间竟然写了一个这么牛皮的编程语言。 现在,全世界差不多有 ...

weixin_33889245的博客 222

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

python中常见的魔法方法 magic method

魔法方法都是父类object有的,在python3中所有的类默认都会继承object。当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数。到达条件自动触发

onlinexkxk的博客 659

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Python学习之-魔术方法

Python 中的魔术方法(Magic Methods),也称作特殊方法(Special Methods),是那些被双下划线包围的方法,例如init。这些方法在 Python 中有特殊的含义,它们并不需要直接调用,而是在特定的情境下自动触发。通过定义或重写这些方法,可以自定义对象的行为,包括迭代、函数调用、属性访问等多种操作。对象的创建和销毁:控制对象的创建 (new)、初始化 (init) 和销毁 (del) 的过程。对象表示:定制对象的字符串表示,包括通过str。

Summer的博客 1944

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

草根学Python(十二)元类

前言 第十二篇了,撸起袖子,就是干。 目录 草根学Python(十二)元类 一、Python 中类也是对象 在了解元类之前,我们先进一步理解 Python 中的类,在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在 Python 中这一点也是一样的。 class ObjectCreator(object): pass mObject = ObjectCreator() ...

weixin_33701564的博客 241

Python Magic Method 与 Setup 方法:深入解析与应用

Python 中的魔法方法,也称为双下划线方法或特殊方法,格式为 “方法名”。这些方法无需主动调用,而是在特定场景下由 Python 解释器自动调用。魔法方法的作用是自定义类的行为,以便与内置操作符(例如 +、-、*、/、== 等)和函数(例如len()str()等)交互。

四楼没电梯的专栏 1471

python基础知识(23)Magic Method

在 Python 中,所有以 "__" 双下划线包起来的方法,都统称为"魔术方法"。可以看到,一个类的魔术方法还是挺多的,不过我们只需要了解一些常见和常用的魔术方法就好了。使用这些魔术方法,我们可以构造出优美的代码,将复杂的逻辑封装成简单的方法。我们可以使用 Python 内置的方法。那么一个类中有哪些魔术方法呢?魔术方法有什么作用呢?

ty_wink的博客 891

python magic函数_Python Magic Method

Python 的 Magic Method 就是以双下划线起始和结尾的方法。为什么要有这些方法呢?我的理解是:Python 中万物皆对象,所以如果 Python 完全遵循面向对象的原则,那么所有的方法调用应该都是 obj.method(args) 这种形式,但事实上 Python 中有许多的内置函数和操作符,这些内置函数和操作符调用的就是这些 magic method。所以说,magic meth...

weixin_28940217的博客 479

草根学Python(十三)线程和进程

前言 拖了好久,不过还是得坚持。喜欢本文的话可以加下公众号【于你供读】。 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程。 操作系统会为这些进程分配一些执行资源,例如内存空间等。在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。 我们都知道现代操作系统比如 Mac OS X,UNIX,Linux,Windows 等可...

weixin_33835690的博客 329

Python零基础,从草根到进阶的入门笔记,学习效果非常不错

我接触python的时间虽然只有短短的三个月,但是对Python的兴趣是越来越浓,相信如果是你,肯定也会是同样的感觉。零基础学习Python到底难不难呢?作为同样是初学者的我,给大家分享一下我的学习心得和总结,零基础的人,应该如何学习Python。学习一定要是一个坚持的过程,如果三天打鱼两天晒网,龟兔赛跑的故事大家都知道,所以学习可以慢但不要停。

Python966的博客 157

Python 魔法方法 (Magic Method)

特性描述目的让自定义类能够与 Python 的内置操作符、函数和协议无缝集成。名称前后带有双下划线__(如__init____add__调用隐式/自动调用。你使用len(obj),Python 帮你调用。本质它们并不是真正的“魔法”,而是 Python 数据模型的一部分,是一种清晰的、预定义的接口,让你能够扩展语言的功能。简单来说:魔法方法就是让你自己定义的类也能像内置类型(如listdictstr)一样“好用”和“自然”的关键。

weixin_44012667的博客 782

python魔术函数_Python魔术方法-Magic Method

介绍在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,但是对于官方的描述比较混乱而且组织比较松散。很难找到有一个例子。构造和初始化每个Pythoner都知道一个最基本的魔术方法, __init__ 。通过此方法我们可以定义一个对象的初始操作。然而,当调用 x = ...

weixin_33763709的博客 337

python的魔法方法(magic method)

1,什么是魔法方法 对象中前后都有双下划线修饰的方法中大部分是有特殊意义的,在这样的名称中很大一部分是魔法(特殊)方法的名称,如__future__。 如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 自动地调用,你可以在重载的魔法方法里面定义自己想要的行为,从而在Python 自动调用这些魔法方法时执行你自己想要的行为。 2,基本的魔法方法详解 1)构...

ACBC12345的博客 623

Python知识点——魔法方法(Magic Method)

魔法方法是 Python 面向对象编程的灵魂,它们为你的类赋予了与 Python 核心语法无缝集成的能力。核心思想:不是调用方法,而是使用语言本身的语法(如==len()),Python 会自动 dispatch 到对应的魔法方法。常见用途对象生命周期管理__new____init__友好的字符串输出__str____repr__自定义比较逻辑__eq____lt__等支持算术运算__add____mul__等模拟内置容器__len____iter__等。

跟佟格湾一起学习计算机知识吧~ 554
上一篇: 草根学Python(九) 面向对象
下一篇: 草根学Python(十一)枚举类
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值