广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python超详细讲解元类的使用
  • 919
分享到

Python超详细讲解元类的使用

2024-04-02 19:04:59 919人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录类的定义一、什么是元类二、注意区分元类和继承的基类三、type 元类的使用四、自定义元类的使用类的定义 对象是通过类创建的,如下面的代码: # object 为顶层基类 clas

类的定义

对象是通过类创建的,如下面的代码:

# object 为顶层基类
class Work(object):
    a = 100
Mywork = Work()   # 实例化
print(Mywork )   # Mywork 是 Work 所创建的一个对象  <__main__.Work object at 0x101eb4630>
print(type(Mywork))    # <class '__main__.Work'>
print(type(Work))    # 类型为元类 <class 'type'>

解析:

可以看见对象 Mywork 是类 Work 创建的实例。然但是可以看到Work的类型时由一个叫 type 的类创建的实例。即 Mywork —》 Work —》 type 创建

上面的例子中对象是动态创建的,类则是通过关键字 class 声明定义的

那么class关键字背后的玄机是什么呢?

  • 实际上,class Work(object) 这样的代码,等价于 Work = type(‘Work’, (objects, ), {“a”:100})
  • 即类 type 通过实例化创建了它的对象 Work,而这个 Work 恰恰是一个类,这样能创建类的类,就是 python 的元类。而在Python中内置的元类叫:type

一、什么是元类

  • 用来创建类的类,叫做元类
  • 类是元类创建出来的对象
  • 函数type实际上是一个元类,type就是Python在背后用来创建所有类的元类

二、注意区分元类和继承的基类

  • type是元类,所有的类都是通过type所创建出来的
  • object顶层的基类,所有类的继承顶层父类都是object

三、type 元类的使用

可以看到type是小写,一般情况下都会认为它是一个函数,通过查看源代码去看下如下定义的:

class type(object):
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
"""
	# 实例化
	def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
	     """
	     type(object_or_name, bases, dict)
	     type(object) -> the object's type
	     type(name, bases, dict) -> a new type
	     # (copied from class doc)
	     """
	     pass
	# 创建类    
	@staticmethod     # known case of __new__
    def __new__(*args, **kwargs):   # real signature unknown
        """ 
        Create and return a new object.  See help(type) for accurate signature. 
        (创建并返回一个新对象)
        """
        pass

type的用法一:获取数据时那种类型 : type(object) -> the object’s type

a = 100
b = "100"
c = [11,22,33]
print(type(a))    # ======》 <class 'int'>
print(type(b))    # ======》 <class 'str'>
print(type(c))    # ======》 <class 'list'>

type的用法二:创建类:type(object_or_name, bases, dict)

1.在查看源码的时候,可以看到在初始化时,init__方法接受三个参数,type 在实例化的过程,也会重新创建一个新的类,而创建类的代码来自__new 方法,它的参数与 __init__方法是一样的。

2.当调用 type 进行实例化的时候,会先自动调用 new 方法,再调用__init__方法,最终会实例化一个对象,这个对象是一个类。

1. 元类 type 的 init 方法有3个参数:

 1.name:类名(字符串类型)
 2.bases:继承的父类(元祖类型)
 3.dict:属性和方法组成的字典(字典类型)

具体例子:

# 通过 class 定义类
class Myclass(object):
    a = 100
    b = 200
# 通过type创建的类(动态创建类)
Myclass1 = type("Myclass1",(object,),{"a":"100","b":"200"})
print(Myclass)
print(Myclass1)

如果需要定义实例方法和类属性怎么办呢?,将方法和属性以字典的形式传进去

def work(self):
    print("这是实例方法——————work————————")
# 定义类属性值
def init_method(self, aa, bb, cc):
    self.aa = aa
    self.bb = bb
    self.cc = cc
# 通过type创建的类(动态创建类)
Myclass2 = type("Myclass2",(object,),{"a":"100","b":"200","work":work,"work_1":work_1,"__init__":init_method})
m = Myclass2(11,22,33)
m.work()
print(m.aa, m.bb, m.cc)

四、自定义元类的使用

既然元类可以创建类,那也可以自定义元类,自定义直接继承类 type ,在自定义元类的步骤:

1.定义一个类继承type

2.重写new方法

具体例子:

# 定义一个类继承type
class Mytest(type):
	# 重写new方法
    def __new__(cls, type_name, bases, atter, *args, **kwargs):
        new_cls = super().__new__(cls,type_name, bases, atter)         
        return new_cls      # 返回新的类
M2 = Mytest("M2",(Mytest,),{"atter":100})
print(M2)     # =====》  <class '__main__.M2'>

使用class创建类的时候指定自定义的元类

1.不去指定时,默认创建都是type类

2.指定自定义的元类去创建类:metaclass = 指定的元类

class Myclass(type):
    """自定义的元类"""
    def __new__(cls, type_name, bases, attrs, *args, **kwargs):
        new_cls = super().__new__(cls, type_name, bases, attrs)
        print("这个是Myclass:", type_name, bases, attrs, )
        return new_cls
# 通过metaclass=xxxx   继承自定义元类
class Inherited_class(metaclass=Myclass):
    a = 100
    b = 200
print(type(Inherited_class))  # ======》 <class '__main__.Myclass'>

到此这篇关于Python超详细讲解元类的使用的文章就介绍到这了,更多相关Python元类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python超详细讲解元类的使用

本文链接: https://www.lsjlt.com/news/118948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python超详细讲解元类的使用
    目录类的定义一、什么是元类二、注意区分元类和继承的基类三、type 元类的使用四、自定义元类的使用类的定义 对象是通过类创建的,如下面的代码: # object 为顶层基类 clas...
    99+
    2022-11-11
  • C++超详细讲解友元的使用
    目录一、友元的概念二、友元的用法三、友元的语法四、友元的尴尬五、注意事项六、小结一、友元的概念 什么是友元友元是 C++ 中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系...
    99+
    2022-11-13
  • Java超详细讲解ThreadLocal类的使用
    目录Threadlocal有什么用:ThreadLocal使用实例API介绍ThreadLocal的使用Threadlocal 的源码分析原理源码内部类ThreadLocalMapT...
    99+
    2022-11-13
  • C++超详细讲解友元与内部类
    目录一.友元1.友元函数(1)引入原因(2)友元函数作用(3)友元函数特征2.友元类(1)解释(2)友元类特征二.内部类(不常用)1.概念2.特性 一.友元 友元分为: 友...
    99+
    2022-11-13
  • Java超详细讲解类的继承
    目录写在前面1.子类的创建1.1子类的创建方法1.2调用父类中特定的构造方法2.在子类中访问父类成员3.覆盖3.1覆盖父类中的方法3.2用父类的对象访问子类的成员4.不可被继承的成员...
    99+
    2022-11-13
  • Python爬虫超详细讲解
    本篇文章给大家带来了关于Python的相关知识,其中主要整理了爬虫的相关问题,网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序,下面一起来看一下,希望对大家有帮...
    99+
    2022-07-14
    python
  • C++超详细讲解字符串类
    目录一、历史遗留问题二、解决方案三、标准库中的字符串类四、字符串循环右移五、小结一、历史遗留问题 C 语言不支持真正意义上的字符串C 语言用字符数组和一组函数实现字符串操作C 语言不...
    99+
    2022-11-13
  • Python队列Queue超详细讲解
    目录queue模块简介queue.Queue(maxsize=0)queue.LifoQueue(maxsize=0)queue.PriorityQueue(maxsize=0)qu...
    99+
    2023-05-16
    Python队列Queue Python Queue
  • Java超详细讲解抽象类与接口的使用
    目录一、抽象类1、抽象类的语法2、抽象类的特性3、抽象类的作用二、接口1、接口的概念2、接口使用3、接口特性4、实现多个接口5、接口间的继承6、常用的接口(1)Comparable接...
    99+
    2022-11-13
  • Python 元组tuple详解(超详细)
    文章目录 Python内置函数/方法详解—元组tuple1、创建元组1.1 使用 () 创建元组1.2 使用 tuple()函数 创建元组1.3 元组(单个元素)1.4 元组 VS 列表 ...
    99+
    2023-09-16
    python 开发语言 pycharm 后端 算法
  • Java 超详细讲解核心类Spring JdbcTemplate
    目录JdbcTemplate概述JdbcTemplate开发步骤JdbcTemplate快速入门Spring产生JdbcTemplate对象JdbcTemplate的常用操作修改操作...
    99+
    2022-11-10
  • C++超详细讲解模板的使用
    目录一、函数模板1.1函数模板概念1.2 函数模板格式1.3 函数模板的原理1.4 函数模板的实例化二、类模板2.1 类模板的定义格式2.2类模板的实例化总结一、函数模板 1.1函数...
    99+
    2022-11-13
  • Java超详细讲解类变量和类方法
    目录1.static静态变量2.类变量(静态变量的访问)3.类方法1.static静态变量 1.静态变量被同一个类的所有对象共享 2.static类变量在类加载的时候就生成使用 st...
    99+
    2022-11-13
  • C++超详细讲解强制类型转换
    目录1 C 强制类型转换2 C++ 强制类型转转1 C 强制类型转换 C 方式的强制类型转换的用法如下代码所示: (Type)(Expression) Type:需要转换成的类型Ex...
    99+
    2022-11-13
  • Android超详细讲解fitsSystemWindows属性的使用
    对于android:fitsSystemWindows这个属性你是否感觉又熟悉又陌生呢? 熟悉是因为大概知道它可以用来实现沉浸式状态栏的效果,陌生是因为对它好像又不够了解,这个属性经...
    99+
    2022-11-13
  • C++超详细讲解auto与nullptr的使用
    目录一. auto关键字1. auto介绍2. 使用规则3. auto不能推导的场景二. 基于范围的for循环(C++11)1. 范围for的语法2. 范围for的使用条件三. 指针...
    99+
    2022-11-13
  • C++ 超详细示例讲解list的使用
    目录一、list的介绍list的介绍二、list的使用2.1 list的构造函数2.2 list迭代器的使用2.3 list相关的容量大小相关的函数2.4 list数据的访问相关的函...
    99+
    2022-11-13
  • C++ 超详细讲解stack与queue的使用
    目录stack介绍和使用模拟实现stack的使用例题最小栈栈的弹出压入序列逆波兰表达式求值queue模拟实现容器适配器deque简介priority_queue优先级队列priori...
    99+
    2022-11-13
  • Android超详细讲解组件AdapterView的使用
    目录概述 介绍AdapterView的编程模式 Adapter ListView使用myAdapater.javaMainActivity.javamy...
    99+
    2022-11-13
  • Android超详细讲解组件ScrollView的使用
    目录概述练习HorizontalScrollView:概述     ScrollView也是一个容器,它是FrameLayout的子类,它的主要作用就是将超出物理...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作