python元类

Python元类详解 Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。Python与java的区别:Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装成Integer类对象。但是在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象,包括你的代码。MetaClass元类,本质也是一个类,但和普通类的用法不同,它可以对类内部的定义(包括类属性和类方法)进行动态的修改。 阅读详情

在python中可以基于类创建对象

# 定义类
class Foo(object):
	def __init(self, name):
		self.name = name
	def __new__(cls, *args, **kwargs):
		return object.__new__(cls)

obj = Foo("lucky") # lucky

#根据类创建对象时程序内部的实际步骤

  1. 执行类的new方法,创建空对象 【构造方法】
  2. 执行类的init方法,初始化对象 【初始化方法】

可以看出对象是由类创建的,那么类是由谁创建的呢?

答:类默认是由type创建的
# 传统方法创建类
class Foo(object):
	v1 = 123
	def func(self):
		return 666

# 非传统方式创建类(一行)
# 创建类型 类名 继承类 成员
Fa = type("Foo", (object,),{"v1":123,"func":lambda self:666})

# 根据类创建对象
obj = Fa()
# 调用v1的变量(类变量)
print(obj.v1) # 123
# 执行对象中的func方法
result = obj.func() # 666

可以看出type是可以创建类的,那怎么让一个类的创建改成其他的东西呢?
这个时候就引出了元类
元类: 创建类的类

# type 创建Foo类
class Foo(object):
	pass
# 其他东西创建Foo类
class Foo(object, metaclass=其他东西):
	pass

那么现在我们就可以创建一个类继承type,再创建另一个类继承前一个类

class MyType(type):
	pass

class Foo(object, metaclass=MyType):
	pass
# Foo类由MyType创建

这时候其实可以把Foo假设成一个由MyType创建的对象,那我们在创建Foo类时也就是在执行MyType类中的new和init方法

接下来我们可以在MyType类中写一些方法验证一下调用关系和执行顺序

class MyType(type):
	def __init__(self, *args, **kargs):
		print('init')
		super().__init__(cls, *args, **kwargs)
		
	def __new__(cls, *args, **kwargs):
		print('new')
		new_cls = super().__new__(cls, *args, **kwargs)
		return new_cls
		
	def __call__(self, *args, **kwargs):
		 # 调⽤⾃⼰的那个类 __new__ ⽅法去创建对象
		 empty_object = self.__new__(self)
		 # 调⽤你⾃⼰的__init__ ⽅法去初始化
		 self.__init__(empty_object, *args, **kwargs)
		 return empty_object

class Foo(object, metaclass=MyType):
	def __init__(self, name):
 		self.name = name

# 假设Foo是⼀个对象 由MyType创建
# Foo其实是MyType的⼀个对象
# Foo() -> MyType对象()
# 对象+()实际执行就是继承类的__call__方法

v1 = Foo("lucky") # 等价于MyTpe.__call__ 结果为 new init
print(v1.name) # lucky

在学习元类之后,我们可以在

  • 类创建时自定义功能(__new__, __init__)
  • 对象创建前后自定义功能(__call__)

拓展(元类实现单例模式):

class MyType(type):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.instance = None

    def __call__(self, *args, **kwargs):
        # 判断是否有对象,有则不创建,没有则创建
        if not self.instance:
            self.instance = self.__new__(self)
        # 初始化
        self.__init__(self.instance, *args, **kwargs)
        return self.instance


class Singleton(object, metaclass=MyType):
    pass


class Foo1(Singleton):
    pass


v1 = Foo1()
v2 = Foo1()
print(v1)
print(v2)
Python 的 object类、type元类 在C++,JAVA,C#等面向对象语言中, 类的实例 是 一个对象。 在Python中, 类的实例 是 一个对象,这个没有问题,object类是一切类的父类,这也没什么问题。 但是, type类有点元类的意思,我个人理解为 int,float,object , Animal等类 是 type元类的 一个实例(是一种类型)。 #一切皆对象 print(objec... 阅读详情

相关推荐

波束管理 Beam Management

Beam Management in 5G NR   波束管理,是5G NR中基于信道质量来动态选择每个UE和gNB之间以什么方向和频率的波束beam来进行通信。   背景   5G NR(New Radio)支持非常高的数据速率和更低的延迟。5G NR支持FR1和FR2频段,FR1为亚6 GHz(450至6000 MHz);FR2为毫米波段(24.25 GHz至52.6 GHz)。   由于毫米波频带使用非常高的频率,因此会导致传播损耗和其他损耗。为了补偿损失,在这种频率下定向通信是必不可少的。

最忆是江南的博客 5827

python——元类、元类实现orm

元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立: >>> class ObjectCreator(object): … pass … >>> my_object = ObjectCreator() >>> print(my_object) <__main_...

GC 6794

Cursor+Apifox MCP Server实战:5分钟搞定API自动化测试用例生成

本文详细介绍了如何利用Cursor IDE与Apifox MCP Server,在5分钟内将API文档自动转化为高质量的自动化测试用例。通过配置MCP Server建立数据桥梁,开发者可直接用自然语言指令,让AI基于真实接口规范生成可立即执行的pytest测试代码,大幅提升接口测试效率,特别适合快节奏的SaaS项目。

ooo22的博客 535

Python中的元类

Python中的元类 Python一切皆对象,所以类也是对象。 我们知道,对象是通过类实例化创建出来的。但我们创建类时并没有进行实例化操作,为什么类也是对象呢? 类既然是对象,类肯定是另外某个类的实例。这说明在我们使用class声明一个类的时候Python解释器为我们做了些什么。 一、元类介绍 通过一个类,可以创建无数个实例对象,类就相当于一个生产实例对象的机器,可以不断的生产出实例对象...

weixin_43790276的博客 3915

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6492

模电(十四)差分放大电路

目录 差分放大电路 双端输入双端输出 Q点分析 抑制共模信号 放大差模信号 双端输入单端输出 Q点分析 差模信号分析 共模信号分析 单端输入双端输出 单端输入单端输出 四种接法比较 具有恒流源的差分放大电路 差分放大电路的改进 差分放大电路 采用引入支流负反馈,温度补偿来克服零点漂移(温度变化,直流电源波动,元器件老化产生的输入电压为零,输出电压不为零的...

weixin_43674847的博客 2万+

Python 元类

元类是“类的类”,它用于定义类的行为。换句话说,元类是创建类的模板。在 Python 中,类本身也是对象。元类用于控制类的创建过程,比如类的属性、方法、继承关系等。

weixin_67459449的博客 1473

SAP固定资产原值与净值取值逻辑全解析:从数据表到ABAP实战

在企业资源计划(ERP)系统中,固定资产的价值管理是财务会计的核心模块,其关键在于准确核算资产原值与净值。从技术原理上看,这涉及对资产全生命周期业务(如购置、折旧、转移、报废)的财务建模,以及底层数据表(如ANLC、ANEP)的精准关联与计算。掌握这一逻辑的技术价值在于,能够确保财务报表数据的准确性,满足合规性要求,并为管理决策提供可靠依据。在SAP ECC或S/4HANA系统的应用场景中,ABAP开发者与财务顾问常需通过编写报表程序,从复杂的数据结构中提取资产价值信息。本文聚焦于SAP资产会计模块,深入剖

weixin_30984001的博客 396

python元类_Python元类

python元类Welcome to today’s tutorial on python metaclass. We all know that python is an object oriented programming language which means it binds datas with functionalities i.e. class. Before starting...

从零开始的教程世界 212

智能驾驶域控制器的“终极大考”:解析EOL测试的核心价值与技术实践

在智能驾驶技术高速发展的今天,域控制器(Domain Controller)作为车辆“大脑”的核心部件,承担着传感器数据处理、决策规划、执行控制等关键任务。然而,这个集成了数十个芯片、运行着数百万行代码的复杂系统,如何确保其出厂前的功能安全与性能稳定?答案就藏在被称为“生产线最后一道防线”的EOL(End of Line)测试中。

汽车电子软件领域知识分享 705

如何使用tinyalas接口从usb录音的同时从扬声器播放

3、 以上步骤确认完后,就可以修改tinyhostless.c程序,tinyhostless的本质就是边pcm_read(),边pcm_write();但原本tinyhostless只支持对同一声卡进行操作,所有需要修改其代码,改成录音和播放可支持不同声卡,如果是模拟声卡,有回环测试,可以实现边录边播放,但涉及USB声卡时,就没有现场的类似功能,有时候客户因为硬件特殊性,会有从USB录音的同时从扬声器播放出来的需求,本文简要描述如何使用tinyalsa接口实现该需求;

sdrgtywretyeruet的专栏 972

Python 中的元类是什么

元类是创建类的“东西”。你定义类是为了创建对象,对吧?但我们了解到 Python 中的类也是对象。那么,元类就是创建这些对象的东西。你已经看到type这是因为type函数实际上是一个元类。type是 Python 在幕后用来创建所有类的元类。现在你可能会想,“为什么它是小写的,而不是Type?嗯,我想这是为了与str(创建字符串对象的类)和int保持一致。在 Python 中,一切,我是说一切,都是对象。这包括整数、字符串、函数和类。所有这些都是对象。那么,任何__class__的。

liluo0815481的博客 992

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 188

python中的元类

最近学习到了元类,在此记录其相关概念与应用,希望能够帮到对此有疑惑的人。

qq_75229677的博客 1315

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python基础:元类

通过上面的介绍,终于模模糊糊的带到元类这里来了。可是我们到现在还不知道元类是什么鬼东西。我们创建类的时候,大多数是为了创建类的实例对象。那么元类呢?元类就是用来创建类的。也可以换个理解方式就是:元类就是类的类。通过上面type()函数的介绍,我们知道可以通过type()实际上type()函数是一个元类。type()就是 Python 在背后用来创建所有类的元类。那么现在我们也可以猜到一下为什么type()函数是 type 而不是 Type呢?

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 888

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

python的元类_Python:细说元类

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。Python:细说元类作者:maSnun,2016年5月3日One of the key features of the Python language is that everything is an object. These objects are instances of classes.Pytho...

weixin_39723678的博客 126

Python的元类

有关于元类方面一些常用知识。

qq_38380338的博客 1149

python中的元类_python中的元类

元类什么是元类我们创建一个类目的是为了创建该类的实例对象,而元类就是用来创建类的。换个理解方式就是,元类就是创建类的类。在python中可以使用type函数创建一个类,参考python中type的用法,用法如下:tpye(name, bases, dict)name 类名bases 父类的元组dict 类的属性方法和值组成的键值对实际上 type() 函数就是一个元类,是python默认用来创建所...

weixin_39704246的博客 73

python3元类_Python3 元类

元类exec方法exec()方法可以执行字符串形式的python代码块使用方法exec(object, global=None, local=None)object: 字符串类型的python代码块global: 代表全局名称空间, 必须是字典, 默认为None, 如传参则表明该代码块在全局名称空间中运行local: 代表局部名称空间, 可以是任何映射, 默认为None, 如传参则表明该代码块在局...

weixin_39717825的博客 134

python的元类是什么

什么是python元类 类是为了创建对象,元类是为了创建类。 本文主要来自stackoverflow python中的类 在理解元类之前,我们需要掌握 python 中的类。在大多数语言中,类知识描述如何产生对象的代码段。 在python中也是如此: >>> class ObjectCreator(object): ... pass ... >>&g...

weixin_37946237的博客 576

python元类_Python之元类详细解析

'''1、什么是元类在python中一切皆对象,那么我们用class关键字定义的类本身也是一个对象负责产生该对象的类称之为元类,即元类可以简称为类的类class Foo: # Foo=元类() #一切皆对象,类加括号产生对象pass2、为何要用元类元类是负责产生类的,所以我们学习元类或者自定义元类的目的是为了控制类的产生过程,还可以控制对象的产生过程3、如何用元类'''#1、储备知识...

weixin_39705794的博客 323

python的元类以及应用,元类实现ORM

使用ORM可以方便的进行关系型数据库库操作,减少开发负担。要实现ORM的重点,就是如何把类和实例与关系型数据库进行映射。python的元类,可以在拦截和修改类的创建,因此可以通过元类,在类的定义时,进行映射。回到最初的问题:ORM一定要用元类来实现吗?通过上述的内容可以得知,只要能够完成映射,就不一定需要用元类。后续会展示不使用元类实现的ORM。

weixin_68789096的博客 1015
下一篇: python内存管理&垃圾回收
爱学习的六金同学
博客等级 码龄7年 4粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值