Python进阶丨如何创建你的第一个Python元类
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。
Python元类设置类的行为和规则。元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一。通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。本文介绍以下概念:
什么是Python元类
Python中的类和对象
Python中的动态类
Python元类如何工作
类型类
Python中的自定义元类
装饰器vs元类
什么是Python元类
Python元类是与Python的面向对象编程概念相关的高级功能之一。它确定类的行为,并进一步帮助其修改。
用Python创建的每个类都有一个基础的Metaclass。因此,在创建类时,您将间接使用元类。它隐式发生,您无需指定任何内容。
与元编程相关联的元类决定了程序对其自身进行操作的能力。 学习元类可能看起来很复杂,但是让我们先从一些类和对象的概念入手,以便于理解。
Python中的类和对象
类是一个蓝图,是具有对象的逻辑实体。 一个简单的类在声明时没有分配任何内存,它是在创建一个类的实例时发生的。
通过创建的对象,可以访问该类。该类仅用作模板。对象的属性本质上意味着我们可以在运行时与它进行交互,传递诸如变量之类的参数,进行存储,修改,也可以与它进行交互。
可以使用__class__属性检查对象的类。让我们看一个简单的例子:
class Demo:
pass
#This is a class named demo
test=Demo()
print(test.__class__) #shows class of obj
print(type(test)) #alternate method
Output: class '__main__.Demo'
Python大量处理类和对象的概念,并允许轻松,顺利地进行应用程序开发。但是,什么使Python与Java和C这样的语言不同呢Python中的所有内容都可以定义为具有属性和方法的对象。主题演讲是Python中的类不过是更大类的另一个对象。
类为对象定义规则。同样,元类负责为类分配行为。我们已经知道,类是对象,就像每个对象都有一个实例一样,类是元类的实例。
但是也有像Ruby和Objective-C这样的语言也支持元类。那么,是什么使Python Metaclass更好,为什么还要学习它呢答案是Python中的动态类。让我们仔细看看。
Python中的动态类
Python是一种动态编程语言,并允许在运行时创建类。与C ++等其他语言不同,后者仅允许在编译时创建类。在灵活性方面,Python优于其他静态类型的语言。
动态和静态类型语言之间的差异并不大, 但是在Python中,它由于提供元编程而变得更加有用。
但是,如果我告诉您还有另一个关键功能将Python与其他编程语言区分开呢
诸如Java或C ++之类的语言具有float,char,int等数据类型,而Python将每个变量视为对象。每个对象都属于一个类,例如int类或str类。您可以使用称为type()的内置函数来简单地检查任何变量的类。
number = 10993
print("Type associated is:", type(number))
name = "Aishwarya"
print("Type associated is:", type(name))
Output:
Type associated is: class 'int'
Type associated is: class 'str'
现在,您了解了Python中的所有内容都有与之关联的类型。在下一个主题中,我们将尝试了解元类实际上是如何工作的。
Python元类如何工作
每当创建一个类时,都会调用默认的Metaclass类型。 元类包含名称,基类集以及与该类关联的属性等信息。因此,在实例化一个类时,将调用带有这些参数的类。可以通过两种方法创建元类:
类型类
自定义元类
让我们继续输入class以及如何创建class。
类型类
Python有一个称为type的内置元类。与Java或C不同,那里有主要的数据类型。Python中的每个变量或对象都有一个与之关联的类。Python使用幕后的Type类创建所有类。在上一个主题中,我们看到了如何使用type()检查对象的类。让我们举一个例子,说明如何通过创建一个简单的类来定义新类型。
class Edureka():
obj = Edureka()
print(type(obj))
Output: class '__main__.Edureka'
print(type(Edureka))
Output: class 'type'
在上面的代码中,我们有一个名为Edureka的类,以及一个关联的对象。我们通过简单地在该类型之后创建一个名为自身的类,创建了一个名为Edureka的新类型。在第二个代码中,当我们检查Edureka类的类型时,其结果为“类型”。
因此,除非另有定义,否则元类使用类型类来创建所有其他类。我们可以通过两种方法访问Type类:
当我们通过类型类传递参数时,它使用以下语法。
type(__name__, __base__, attributes)
名称是一个字符串,并带有类名
该基础是一个元组,可帮助创建子类
属性是字典,并分配键值对
由于Python中的类的行为与对象相似,因此可以用相同的方式更改其行为。我们可以在类内添加或删除方法,类似于对对象的处理方式。
现在您已经知道Metaclass在Python中创建了所有其他类,并使用类型class定义了它们的行为。但是,您一定想知道,我们还有其他方法可以创建元类吗因此,让我们看看如何创建一个自定义的元类。
Python中的自定义元类
现在我们知道并理解类型类如何工作。现在该学习如何创建自定义元类了。我们可以通过执行动作或代码注入来修改类的工作。为此,我们可以在创建类定义时将Metaclass作为关键字传递。另外,我们可以通过简单地继承通过此Metaclass关键字实例化的类来实现此目的。
在创建新类时,Python查找__metaclass__关键字。以防万一,如果不存在。它遵循类型类层次结构。
Python在命名空间中执行所有字典后,将调用类型对象,后者创建类的对象。我们可以使用两种方法来创建自定义元类。
class EduFirst(type):
def __new__(cls, name, base_cls, dict):
pass
class EduSecond(type):
def __init__(self, name, base_cls, dict):
pass
让我详细解释这两种方法:
__new __():当用户要在类创建之前定义元组字典时使用。它返回一个类的实例,并且很容易覆盖/管理对象流。
__init __():在创建对象并对其进行初始化之后调用它。
Python中的__call__是什么
在正式的Python文档中,__call__方法可用于定义自定义元类。同样,当调用类定义自定义行为时,我们可以覆盖__prepare__之类的其他方法。
就像类如何像创建对象的模板一样,元类也像类创建模板一样。因此,元类也称为类工厂。
请参见下一个示例:
class Meta(type):
def __init__(cls, name, base, dct):
cls.attribute = 200
class Test(metaclass = Meta):
pass
Test.attribute
Output: 200
元类允许自定义类。还有多种其他有效且简单得多的方法可以通过这些方法实现相同的输出。这样的例子之一就是使用装饰器。
装饰器vs元类
Decorator是Python的一项流行功能,它允许您向代码中添加更多功能。装饰器是可调用的对象,可帮助修改现有的类甚至函数。在编译期间,部分代码将调用并修改另一部分。此过程也称为元编程。
def decorator(cls):
class NewClass(cls):
attribute = 200
return NewClass
@decorator
Class Test1:
pass
@decorator
Class Test2:
pass
Test1.attribute
Test2.attribute
Output: 200
Python中的Decorator是一个非常有用且功能强大的工具,可帮助您更改函数的行为,而无需实际更改任何代码。 当您要在调试时修改程序的一部分而不是重写函数或更改整个程序时,这非常方便。取而代之的是,您只需编写一个单行装饰器,其余的就由它来处理。
本文分享自华为云社区《如何创建您的第一个Python元类》,原文作者:Yuchuan。
点击关注,第一时间了解华为云新鲜技术~
Python进阶丨如何创建你的第一个Python元类 相关文章
time模块
python学习-time模块 预备知识 time模块中时间表现的格式主要有三种: timestamp:时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。 time()、clock() struct_time:时间元组,共有九个元素组。 gmtime()、localtime()、strptime() forma
python系列-python数据结构
字符串 用单引号 ' 或双引号 " 包围起来 使用反斜杠 \ 表示转义 + 实现字符串拼接, * 重复一个字符串内容 使用 in 和 not in 判断一个字符串是否包含另一个字符串 使用 [] 和 [:] 取出某个字符或某些字符 python中一些字符串处理方法 str1 = "hello python"
多中心容灾实践:如何实现真正的异地多活
简介: 在异地多活的实现上,数据能够在三个及以上中心间进行双向同步,才是解决真正异地多活的核心技术所在。本文基于三中心且跨海外的场景,分享一种多中心容灾架构及实现方式,介绍几种分布式ID生成算法,以及在数据同步上最终一致性的实现过程。 一 背景
Git 在团队中的最佳实践--如何正确使用Git Flow【转】
转自:https://www.cnblogs.com/wish123/p/9785101.html 我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用。 Git的优点 Git的优点很多,但是这里只列出我认为非常突出的几点
Qt 如何设置textedit控件按下enter就把消息发出去
如图效果: 上面是一个textBrowser控件,用来显示我发的东西 下面是一个textedit控件,用来发东西 所以,这里实现的是在textedit里面输入文字,按下enter之后,文字到上面去了,当然也可以单击“发送” ui界面如图: 代码如下 widget.h中 1 #ifndef WIDGET_H
HTML、CSS和JS如何变成页面的
我们经常写 HTML 、 CSS 和 JavaScript ,写好这些之后,我们就会在浏览器中看到页面,那浏览器究竟在这背后做了一些什么事情呢本篇文章将揭晓答案! 了解浏览器的渲染原理是我们在通往更深层次的前端开发中不可缺少的,它可以让我们从更深层次、角度去考虑
聊聊如何使用单例模式
介绍 单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。 实现方式 1、使用lock ,保证方法只有一个线程可以进入。 /
python读取excel数据并且画图
一,要读取的数据的格式: 二,数据读取部分: b站视频参考:https://www.bilibili.com/video/BV14C4y1W7Njt=148 # 1930workbook=xlrd.open_workbook('1930.xlsx')sheet= workbook.sheet_by_index(0)A1=[]B1=[]# sheet.cell_value(i,0):第i行的第0个元素for
【Python爬虫】:Scrapy数据持久化
要想将我们爬取到的文件的数据进行持久化操作,那么在Scrapy下有两种方式, 1.基于终端指令的数据持久化 要求:只能将parse方法的返回值储存到文本文件当中 注意:持久化文本文件的类型只能够为csv,json.xml等,不能够为txt,excel 指令使用: scrapy crawl x
2021-02-07:给定两棵二叉树的头节点head1和head2,如何判断head1中是否有某个子树的结构和head2完全一样
福哥答案2021-02-07: 对head1和head2序列化为str1和str2。然后用kmp算法去判断str2是否是str1的子串。如果是,head2是子树;如果不是,head2不是子树。 代码用golang编写,代码如下: package mainimport "fmt"func main() { root := TreeNode{} root.Val =