[Python] 深入理解元类并区分元类中的init、call、new方法

深入理解Python类与对象的使用 本文通过探讨Python中类和对象的概念,展示了如何通过类创建对象,并详细介绍了__init__()方法的作用。同时,文章还涉及了实例变量和方法的概念,以及类变量与实例变量之间的区别。通过实例演示,本文帮助读者更深入地理解面向对象编程在Python中的应用。 阅读详情

0. 参考书籍和元类的作用总结

本文内容参考书籍《流畅的Python》《Effective Python》《编写高质量代码:改善Python程序的91个建议》。我只是知识的搬运工,将知识进行整理,区分出其中的重点并加入自己的理解。感兴趣的最好去翻看原书的相关内容。

  1. 执行到类的代码体结束后时,会调用该类的元类中的__new__和__init__方法,利用这两个方法,可以对类做一些定制化的操作。
  2. 初始化类的实例时,会调动该类的元类中的__call__方法,利用这个方法,可以对类的实例对象做一下定制化的操作。
  3. 初始化类的实例时,__call__、__new__、__init__三个方法的执行顺序是 元类的__call__、类的__new__、类的__init__。

这三点参考 【6. 元类中的 init 、call、new 方法】,结合代码的执行顺序就可以理解了。

1. 元类的定义

元类是制造类的工厂,元类是用于构建类的类。 这句话很重要!!!这句话很重要!!!这句话很重要!!!

我们正常定义类是这样的:

class Person(object):
    pass

class Child(Person):
    ClassName = 'Child'
    def __init__(self, name, age):
        if age > 20:
            raise ValueError("Child's age must small than 20")
        self._name = name
        self._age = age

    def speak(self):
        print(self._name, self._age)

我们还可以使用 type 来动态创建类:

class Person(object):
    pass


ClassName = 'Child'
def __init__(self, name, age):
    if age > 20:
        raise ValueError("Child's age must small than 20")
    self._name = name
    self._age = age

def speak(self):
    print(self._name, self._age)

# type 的三个参数分别是 name、bases 和 dict。最后一个参数是一个映射,指定新类的属性名和值。
Child = type('Child', (Person,), {'ClassName': ClassName,
                                      '__init__': __init__,
                                      'speak': speak})
john = Child('John', 20)
john.speak()
print(Child.__dict__)  # 有 ClassName,__init__ 和 speak 属性

使用 type 关键字去拼接函数和属性来创建类,实在是不够优雅。之所以谈到这个,是为了方便我们后面理解元类是如何动态改变类的属性的。

2. 区分继承自 type 和使用 metaclass 关键字

元类从 type 类继承了构建类的能力。所有类都直接或间接地是 type 的实例,不过只有元类同时也是 type 的子类。搞清楚这句话,意思就是,元类是 type 类的子类。使用 metaclass 关键字的类并不是type 的子类。

class ClassOne(type):  # 这个是元类
    pass

class ClassTwo(metaclass=type):  # 不是元类,是用元类创建的类
    pass

class ClassThree(object, metaclass=type):   # 与ClassTwo一模一样。不是元类,是用元类创建的类
    pass

class ClassFour(ClassOne):  # 继承自元类,是元类
    pass

print(ClassOne.__mro__)
print(ClassTwo.__mro__)
print(ClassThree.__mro__)
print(ClassFour.__mro__)
(<class '__main__.ClassOne'>, <class 'type'>, <class 'object'>)
(<class '__main__.ClassTwo'>, <class 'object'>)
(<class '__main__.ClassThree'>, <class 'object'>)
(<class '__main__.ClassFour'>, <class '__main__.ClassOne'>, <class 'type'>, <class 'object'>)

一定要搞清继承自 type 和使用 metaclass 关键字的不同。前者是元类,后者是由元类创建的类。

3. 类装饰器的运行

为什么要讲类装饰器?因为类装饰器能以较简单的方式做到需要使用元类去做的事情 ——创建类时定制类。

类装饰器与函数装饰器非常类似,是参数为类对象的函数,返回原来的类或修改后的类。我们先来看代码,你可以尝试写一写答案:

"""
请问代码中print语句的打印顺序?
"""
def deco_alpha(cls):
    print('<[200]> deco_alpha')

    def inner_1(self):
        print('<[300]> deco_alpha:inner_1')

    cls.method_y = inner_1
    return cls

@deco_alpha
class ClassThree():
    print('<[7]> ClassThree body')

    def method_y(self):
        print('<[8]> ClassThree.method_y')


if __name__ == '__main__':
    print('<[12]> ClassThree tests', 30 * '.')
    three = ClassThree()
    three.method_y()
<[7]> ClassThree body		# MetaAleph 类的定义体运行了
<[200]> deco_alpha			# 装饰器函数运行了
<[12]> ClassThree tests ......
<[300]> deco_alpha:inner_1	# 装饰器覆盖了原有 MetaAleph 类的 method_y

先运行了被装饰的类 ClassThree 的定义体,然后运行装饰器函数,装饰器函数覆盖了原有 MetaAleph 类的 method_y 方法。

类装饰器有个重大缺点:只对直接依附的类有效。 如果我们新增一个 ClassThree 的子类 ClassFour:

"""
请问代码中print语句的打印顺序?
"""
def deco_alpha(cls):
    print('<[200]> deco_alpha')

    def inner_1(self):
        print('<[300]> deco_alpha:inner_1')

    cls.method_y = inner_1
    return cls

@deco_alpha
class ClassThree():
    print('<[7]> ClassThree body')

    def method_y(self):
        print('<[8]> ClassThree.method_y')

class ClassFour(ClassThree):
    print('<[9]> ClassFour body')

    def method_y(self):
        print('<[10]> ClassFour.method_y')

if __name__ == '__main__':
    print('<[12]> ClassThree tests', 30 * '.')
    three = ClassThree()
    three.method_y()
    print('<[13]> ClassFour tests', 30 * '.')
    four = ClassFour()
    four.method_y()
<[7]> ClassThree body
<[200]> deco_alpha
<[9]> ClassFour body
<[12]> ClassThree tests ..............................
<[300]> deco_alpha:inner_1
<[13]> ClassFour tests ..............................
<[10]> ClassFour.method_y

类装饰器可能对子类没有影响。我们把 ClassFour 定义为 ClassThree 的子类,但是发现 ClassFour 的 method_y 方法并没有被覆盖。ClassThree 类上依附的 @deco_alpha 装饰器把 method_y 方法替换掉了,但是这对 ClassFour 类根本没有影响。当然,如果 ClassFour.method_y 方法使用 super(…) 调用 ClassThree.method_y 方法,我们便会看到装饰器起作用,执行 inner_1 函数。

类装饰器的缺点就是一次只定制一个类, 而不是定制整个类层次结构。 而元类就是为了解决这个缺点的,元类可以定制整个类层次结构。

4. 元类的运行

元类可以定制整个类层次结构。我们先看看代码,代码中 print 的语句较多,结构其实并不复杂,尝试写一写答案:

"""
请问代码中print语句的打印顺序?
"""
class MetaAleph(type):
    print('<[400]> MetaAleph body')

    def __init__(cls, name, bases, dic):
        print('<[500]> MetaAleph.__init__')

        def inner_2(self):
            print('<[600]> MetaAleph.__init__:inner_2')

        cls.method_z = inner_2

print('<a> ClassFive Before')
class ClassFive(metaclass=MetaAleph):
    print('<[6]> ClassFive body start')

    def __init__(self):
        print('<[7]> ClassFive.__init__')

    def method_z(self):
        print('<[8]> ClassFive.method_y')

    print('<[11]> ClassFive body end')

print('<c> ClassSix Before')
class ClassSix(ClassFive):
    print('<[9]> ClassSix body start')

    def method_z(self):
        print('<[10]> ClassSix.method_y')
    print('<[12]> ClassSix body end')

if __name__ == '__main__':
    print('<[13]> ClassFive tests', 30 * '.')
    five = ClassFive()
    five.method_z()
    print('<[14]> ClassSix tests', 30 * '.')
    six = ClassSix()
    six.method_z()
<[400]> MetaAleph body
<a> ClassFive Before
<[6]> ClassFive body start
<[11]> ClassFive body end
<[500]> MetaAleph.__init__
<c> ClassSix Before
<[9]> ClassSix body start
<[12]> ClassSix body end
<[500]> MetaAleph.__init__
<[13]> ClassFive tests ..............................
<[7]> ClassFive.__init__
<[600]> MetaAleph.__init__:inner_2
<[14]> ClassSix tests ..............................
<[7]> ClassFive.__init__
<[600]> MetaAleph.__init__:inner_2

ClassSix 类没有直接引用 MetaAleph 类,但是却受到了影响,因为它是 ClassFive 的子类,进而也是 MetaAleph 类的实例,所以由 MetaAleph.__init__ 方法初始化。 这就是元类的作用了。

5. 理解元类的四个参数

Python 解释器运行到 ClassFive 类的定义体时没有调用 type 构建具体的类定义体,而是调用 MetaAleph 类。看一下示例中定义的 MetaAleph 类,你会发现 __init__ 方法有四个参数。
> cls
这是要初始化的类对象(例如 ClassFive)。
> name、bases、dic
与构建类时传给 type 的参数一样。

记得这串代码吗? type 的三个参数 name、bases、dic :
Child = type('Child', (Person,), {'ClassName': ClassName,
                                      '__init__': __init__,
                                      'speak': speak})

6. 元类中的 init 、call、new 方法

话不多说,直接上代码,体会一下三个方法的运行顺序。

class MetaAleph(type):
    print('<[100]> MetaAleph body')

    def __init__(cls, name, bases, dic):
        super().__init__(name, bases, dic)
        print('<[500]> MetaAleph.__init__')
        print('<[501]> MetaAleph. —— name:', name)
        print('<[502]> MetaAleph. —— bases:', bases)
        print('<[503]> MetaAleph. —— dic:', dic)     # dic 中包含ClassFive的class_name、__init__、__new__、__call__

    def __new__(mcs, name, bases, dic):
        print('<[600]> MetaAleph.__new__')
        return super().__new__(mcs, name, bases, dic)

    def __call__(cls, *args, **kwargs):
        print('<[700]> MetaAleph.__call__')
        return super().__call__(*args, **kwargs)

class ClassFive(metaclass=MetaAleph):
    print('<[6]> ClassFive body start')
    class_name = 'ClassFive'

    def __init__(self):
        print('<[7]> ClassFive.__init__')

    def __new__(cls, *args, **kwargs):
        print('<[8]> ClassFive.__new__')
        return super().__new__(cls)

    def __call__(self, *args, **kwargs):
        print('<[9]> ClassFive.__call__')
        return '<[10]> ClassFive.__call__ return'


if __name__ == '__main__':
    print('<[13]> ClassFive tests', 30 * '.')
    five = ClassFive()
    print(five())  # 为了调用ClassFive.__call__
<[100]> MetaAleph body
<[6]> ClassFive body start
<[600]> MetaAleph.__new__
<[500]> MetaAleph.__init__
<[501]> MetaAleph. —— name: ClassFive
<[502]> MetaAleph. —— bases: ()
<[503]> MetaAleph. —— dic: {'__module__': '__main__', '__qualname__': 'ClassFive', 'class_name': 'ClassFive', '__init__': <function ClassFive.__init__ at 0x0000020FE6CE5B88>, '__new__': <function ClassFive.__new__ at 0x0000020FE6CE5C18>, '__call__': <function ClassFive.__call__ at 0x0000020FE6CE5CA8>, '__classcell__': <cell at 0x0000020FD5D89A38: MetaAleph object at 0x0000020FE658EDC8>}
<[13]> ClassFive tests ..............................
<[700]> MetaAleph.__call__
<[8]> ClassFive.__new__
<[7]> ClassFive.__init__
<[9]> ClassFive.__call__
<[10]> ClassFive.__call__ return

再次总结一下:

  1. 执行到类的代码体结束后时,会调用该类的元类中的__new__和__init__方法,利用这两个方法,可以对类做一些定制化的操作。一般来说实现 __init__ 方法就可以了。
  2. 初始化类的实例时,会调动该类的元类中的__call__方法,利用这个方法,可以对类的实例对象做一下定制化的操作。
  3. 初始化类的实例时,__call__、__new__、__init__三个方法的执行顺序是 元类的__call__、类的__new__、类的__init__。

7. 元类中的prepare方法

元类构建新类时,__prepare__ 方法返回的映射会传给 __new__ 方法的最后一个参数,然后再传给 __init__ 方法。看示例,十分简单:

其余不变,就增加一个 __prepare__ 方法:

class MetaAleph(type):
    print('<[100]> MetaAleph body')

    @classmethod
    def __prepare__(mcs, name, bases):  # 必须要是类方法
        print('<[200]> MetaAleph.__prepare__')
        _dict = super().__prepare__(name, bases)
        print('<[201]> MetaAleph.__prepare__ dict:', _dict)
        return _dict        # 返回的映射会传递给__new__方法的最后一个参数,然后再传给__init__方法

	... ...
<[100]> MetaAleph body
<[200]> MetaAleph.__prepare__
<[201]> MetaAleph.__prepare__ dict: {}
<[6]> ClassFive body start
<[600]> MetaAleph.__new__
<[500]> MetaAleph.__init__
<[501]> MetaAleph. —— name: ClassFive
<[502]> MetaAleph. —— bases: ()
<[503]> MetaAleph. —— dic: {'__module__': '__main__', '__qualname__': 'ClassFive', 'class_name': 'ClassFive', '__init__': <function ClassFive.__init__ at 0x0000029011AF5CA8>, '__new__': <function ClassFive.__new__ at 0x0000029011AF5D38>, '__call__': <function ClassFive.__call__ at 0x0000029011AF5DC8>, '__classcell__': <cell at 0x00000290027A55E8: MetaAleph object at 0x0000029011466BB8>}
<[13]> ClassFive tests ..............................
<[700]> MetaAleph.__call__
<[8]> ClassFive.__new__
<[7]> ClassFive.__init__
<[9]> ClassFive.__call__
<[10]> ClassFive.__call__ return

使用 collections.OrderedDict() 可以将用户定义的类中声明的字段按顺序记录下来,比如与 CSV 文件中各列的顺序对应起来:

import collections

class MetaAleph(type):
    @classmethod
    def __prepare__(mcs, name, bases):  # 必须要是类方法
        return collections.OrderedDict()

8. 元类的妙用

待续/…

森林冰火人html源码,森林冰火人单人版(源码) 【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ... 阅读详情

相关推荐

从零到一:ArduPilot无人船PID调参实战指南

本文详细介绍了ArduPilot无人船PID调参的实战指南,从基础参数设定到高级调参技术,帮助用户掌握水面环境下的PID控制逻辑。通过案例分析和参数示例,解决无人船在空载、负载变化及不同水域环境中的航行问题,提升无人船的稳定性和精确度。

weixin_29266647的博客 506

详解Python中的__new__、__init__、__call__三个特殊方法

详解Python中的__new__、__init__、__call__三个特殊方法 <section> <article class="clearfix"> <p>__new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)<br> init : 对象的初始化, 是一个实例方法,第一个参数是self。 call : 对象可call,注意不是类,是对象。 先有创建,才有初始化。即先.

qq_15821487的博客 1383

CentOS 环境 sngrep 安装及使用

在呼叫中心类应用开发过程中,经常需要对 SIP 信令抓包,分析排查问题。通常抓包的工具非常多样,如 Wireshark、tcpdump、ngrep 等都是可选项,但是针对 SIP 信令的抓包,sngrep 则更为好用。因为 sngrep 不仅提供了图形界面,还会将一通会话的 SIP 信令关联汇总,非常直观执行以下命令下载 的相关依赖库 1.2 添加 sngrep 的源并导入 执行下面的命令新增一个源仓库配置文件 然后在该文件中写入以下配置内容 执行命令导入源仓库的公钥 1.3 安装 sngrep

谈谈1974 8143

Python 中的 __init__、__new__ 和 __call__ 详解

掌握这三个特殊方法的区别和协作机制,能够让你更精细地控制 Python 对象的整个生命周期,实现更高级的设计模式。常用场景:单例模式、不可变类型子类化。:使类的实例可以像函数一样被调用。决定是否返回新实例或已有实例。:必须返回创建好的实例对象。:初始化新创建的实例对象。如果未定义,继承父类的。解决方案:使用标志位控制。创建实例之后自动调用。每个类可以定义自己的。必须返回有效的对象实例。如果返回非当前类实例,定义实例作为函数的行为。设置实例属性的初始值。执行必要的初始化操作。:实际创建类的新实例。

m0_37989702的博客 2591

UE5.2 DynamicMesh避坑指南:从蓝图生成到物理碰撞的完整流程

本文详细解析了在UE5.2中使用DynamicMesh组件时,如何正确选择ADynamicMeshActor与AGeneratedDynamicMeshActor,并提供了从蓝图生成、初始化到配置物理碰撞的完整避坑流程。重点解决了SpawnActor失效、碰撞更新等常见问题,帮助开发者高效实现程序化网格生成与动态变形效果。

rrr55的博客 314

MTK Linux Charger驱动分析(二) - power_supply_core.c

的核心作用可以概括为:提供统一的电源管理框架;管理电源设备注册、属性访问、事件通知;封装sysfs 接口和 uevent 通知,屏蔽硬件细节;驱动开发者只需要实现,不关心底层通知和接口细节。简单来说,它是电源子系统的“大脑和中枢”,具体的电池/充电器只是“信息源”。

iTom1900 1488

深刻理解Python中的元类(metaclass)以及元类实现单例模式

在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩;在看python cookbook中关于元类创建单例模式的那一节有些疑惑。因此花了几天时间研究下元类这个概念。通过学习元类,我对python的面向对象有了更加深入的了解。这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博...

weixin_33991418的博客 583

PX4与ROS协同仿真:从键盘控制到无人机自主飞行

本文详细介绍了如何搭建PX4与ROS协同仿真环境,实现从键盘控制到无人机自主飞行的完整流程。通过XTDrone项目整合PX4飞控、ROS通信框架与Gazebo物理引擎,逐步讲解环境配置、键盘控制实现原理,并深入剖析了迈向Offboard模式实现自主飞行的核心代码与数据流,为无人机算法开发与测试提供了安全的仿真沙盒。

weixin_29169899的博客 498

python 元类的call_Python 元类详解 __new__、__init__、__call__[补充说明]

昨天收官之作,以为自己懂的差不多了,但今天看了工作中的框架源码。def with_metaclass(meta, *bases):"""Create a base class with a metaclass."""# This requires a bit of explanation: the basic idea is to make a dummy# metaclass for one l...

weixin_33746833的博客 239

C#上位机开发:西门子/三菱PLC通信,新手直接上手

对着西门子S7协议文档看半天,连“DB块地址怎么写”都搞不懂;写三菱PLC代码时,分不清MC协议和Modbus的区别,代码改来改去连不上;好不容易跑通代码,换个PLC型号又报错,不知道哪里出问题;后来发现,新手学PLC通信根本不用先啃协议文档——先跑通“能通信”的代码,再慢慢理解底层逻辑,效率至少提升3倍。西门子PLC:用S7NetPlus库(新手最友好),实现以太网通信,支持S7-200 SMART/1200/1500;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 877

【Ellisys】【使用技巧】【二】

支持所有常见的编码器和协议实时播放或保存(无线和HCI)循环播放导出与其他视图协同(OverView 和 Spectrum)可以通过下面的位置看 重传的包。

奔跑吧 android 的博客 135

一问搞懂python的__init__和__new__方法

一、文字概述 __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。 __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。 故而“ 本质上 ”来说,__new__()方法负责创建实例,而__init__()仅仅是负责实例属性相关的初始化而已,执行顺序是,先new后init。 二、new和init的执行顺...

MIss-Y的博客 3231

Agent应用实践之三十六 - AgentScope高阶用法:AG-UI

AI 大模型飞速进化,不懂 AI、不会用 Agent 的程序员,正在慢慢被行业淘汰。现在 AI 新技术迭代快到离谱:RAG 还没学明白,MCP 接踵而来;工具刚上手,Skills、各类新 Agent 概念又轮番刷屏;Manus还没看懂,就出来OpenClaw,OpenClaw热度还没退,又出来Hermes。越追越乱、越学越焦虑,永远在被动跟风,陷入学不完、跟不上、用不上的内耗。其实焦虑的根本原因,不是新技术太多,而是不懂大模型 Agent 应用底层原理,只会零散跟风,没有通用方法论。为此我专门推出Agent

代码让AI扣 137

深入理解__init__和__new__

目录 前言 理解 __new__ 和 __init__ 的区别 Python2中的类 处理不同的情况 简单总结: 参考文章 前言 文章内容为understanding-new-and-init的译文。 本文的目的是讨论Python中的 ...

weixin_30600503的博客 227

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Python面向对象编程核心】:__init__与__new__到底有什么区别?

掌握Python面向对象核心机制,深入解析__init__与__new__方法区别。详解二者在实例创建与初始化中的不同作用,涵盖适用场景与设计模式应用,助你理解类构建底层逻辑。内容实用清晰,值得收藏。

FastSolve的博客 799

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

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

php 无父类 用parrent,python当中__metaclass__探讨

最初博主是希望在python当中创建一个单列模式的类,因为python当中不像java和php当中有权限修饰符(private),所以实现起来要绕一点。网上找了一下python实现单列模式,类似的大概有这种方法:classsingleton(type):"""实现单列模式的元类总之,metaclass的主要任务是:拦截类,修改类,返回类"""def__init__(cls,classname,...

weixin_39968410的博客 105

Python元编程入门关键:__new__与__init__的职责划分(错过即损失)

掌握Python元编程关键,深入解析__new__与__init__方法区别。明确构造实例与初始化流程的分工,涵盖类创建时机、适用场景及设计模式应用。理解二者职责划分,提升代码灵活性与控制力,值得收藏。

BytePulse的博客 618

Python中__new__和__init__的区别是什么?资深架构师一文讲透

掌握Python __init__与__new__方法区别,深入解析对象创建机制。详解__new__负责实例创建、__init__负责初始化的执行流程,涵盖单例模式等应用场景。理解二者调用顺序与使用要点,提升面向对象编程能力,值得收藏。

InstrIsle的博客 1040

Python面试高频题解析:从GIL到元类,掌握核心概念与实战技巧

在Python编程中,理解核心概念和底层原理是提升开发能力的关键。从内存管理机制到高级语法特性,掌握这些原理有助于编写更高效、健壮的代码。例如,GIL(全局解释器锁)作为CPython解释器的核心机制,深刻影响着多线程程序的并发性能,理解其工作原理对于优化CPU密集型和I/O密集型任务至关重要。装饰器作为Python的重要特性,基于闭包和函数作为一等公民的原理,能够优雅地实现功能增强,如日志记录和性能测试。这些技术在实际工程中广泛应用于Web框架、数据处理和系统优化等场景。本文聚焦Python面试中的高频考

weixin_29230805的博客 335

Python元类实战:手写ORM框架解析数据库映射原理

元类(Metaclass)是Python中控制类创建过程的高级特性,通过拦截类定义实现动态修改类行为。在数据库编程领域,ORM框架利用元类将类属性映射为数据库字段,实现对象与关系型数据的自动转换。本文以构建简易ORM框架为例,详解如何通过元类实现模型定义、字段类型转换和SQL语句生成等核心功能,帮助开发者深入理解Django和SQLAlchemy等主流ORM框架的底层机制。通过实践Python元编程技术,开发者可以掌握数据库操作抽象、查询构造优化等工程实践方法,提升Web开发效率。

weixin_34389926的博客 355

Python面试核心:GIL、描述符、元类与上下文管理器深度解析

在Python编程中,理解语言的核心机制是编写高效、健壮代码的基础。从内存管理到面向对象设计,Python通过一系列底层协议和特殊方法提供了强大的灵活性。其中,全局解释器锁(GIL)作为CPython的内存管理机制,深刻影响着多线程并发性能,尤其在CPU密集型任务中需通过多进程或异步编程规避。描述符协议(__get__、__set__)则是属性访问控制的基石,它支撑了@property装饰器和ORM字段映射的实现,实现了数据验证和延迟计算等高级特性。元类作为“类的类”,通过控制类的创建过程,广泛应用于框架级

weixin_32288959的博客 227

python中什么是继承_实例详解python中类的继承

这篇文章主要介绍了python类的继承实例详解的相关资料,需要的朋友可以参考下python 类的继承对于许多文章讲解python类的继承,大多数都是说一些什么oop,多态等概念,我认为这样可能对有一定基础的开发者帮助不是那么大,不如直接用在各种情况下所写的代码,来展示对于某一种代码情况,代码运行会有什么效果。这样可能对开发者的帮助更大。不说废话,直接上代码。这里不区分经典类和新式类,下面分析的对新...

weixin_33181210的博客 401

第22课:Python|类的定义、实例化、属性与方法全方位精讲

本文深入讲解了Python类的核心机制,包括类的定义本质、实例化流程、属性查找顺序和方法类型。主要内容包括:1)Python 3统一为新式类,类本身也是对象;2)实例化过程涉及__new__和__init__方法;3)属性查找遵循实例→类→父类的MRO顺序;4)区分实例方法、类方法和静态方法的使用场景;5)通过__slots__优化内存管理。掌握这些底层原理有助于编写更高效的面向对象代码,解决属性覆盖问题,并优化大量对象场景下的性能表现。

Java 后端|Python|AI 实战博主。专注微服务、分布式、大模型应用开发,输出可落地项目、源码剖析与面试总结。用通俗文字拆解技术难点,记录开发路上的学习与踩坑,期待和大家一起交流成长。 485

Python基础——类和对象

Python中的类和对象,私有和公有,继承和多重继承,组合,构造和析构函数,以及绑定的概念

薛定谔的猫的博客 4251

PyTorch新手避坑:transform=ToTensor 少个括号引发的‘TypeError: __init__() takes 1 positional argument but 2 were

本文深入解析了PyTorch新手常见的`TypeError: __init__() takes 1 positional argument but 2 were given`错误,揭示了其根源在于`transform=ToTensor`缺少括号导致的类与实例混淆问题。通过剖析Python可调用对象本质和PyTorch数据加载机制,提供了实用的调试方法和预防策略,帮助开发者避免类似陷阱。

angw337679452的博客 517

python中面向对象的理解_深入理解Python中的面向对象

我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。调用类的其它信息在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过self,调用类属性。classHuman(object):laugh='hahahaha'defshow_laugh(self):printself.laughdeflaugh_100th(self)...

weixin_39620679的博客 74

Python面向对象基础与魔法方法详解

本文主要介绍了面向对象的基础内容(类与对象)和一些常见的魔法方法。人类 将具有共同特征和行为的事物进行抽象,抽象出一个类对象 类中具体的一个实例-->张三 李四 王五类是抽象的 , 在使用的时候通常会找到这个类的一个具体的存在 , 使用这个具体的存在。一个类可以找到多个对象# 定义类# 语法格式:# class 类名(要继承的父类):# 属性# 方法# 1.类名首字母大写,推荐使用大驼峰命名法(每一个单词首字母都大写,其余字母都小写)

啊猪是的读来过倒的博客 770
上一篇: [Python] 详解使用动态规划求解最大回撤并绘图
下一篇: [Python] 详解从属性描述符到实现ORM模型
Spade_
博客等级 码龄10年 918粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值