摘要:通过本文,将深入讨论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 demotest=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类型。 元类包含名称,基类集以及与该类关联的属性等信息。因此,在实例化一个类时,将调用带有这些参数的类。可以通过两种方法创建元类:

  1. 类型类
  2. 自定义元类

让我们继续输入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

让我详细解释这两种方法:

  1. __new __(): 当用户要在类创建之前定义元组字典时使用。它返回一个类的实例,并且很容易覆盖/管理对象流。
  2. __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 = 200return NewClass
@decorator
Class Test1:pass
@decoratorClass Test2:pass
Test1.attributeTest2.attribute

Output: 200

Python中的Decorator是一个非常有用且功能强大的工具,可帮助您更改函数的行为,而无需实际更改任何代码。 当您要在调试时修改程序的一部分而不是重写函数或更改整个程序时,这非常方便。取而代之的是,您只需编写一个单行装饰器,其余的就由它来处理。

本文分享自华为云社区《如何创建您的第一个Python元类?》,原文作者:Yuchuan。

点击关注,第一时间了解华为云新鲜技术~

Python进阶丨如何创建你的第一个Python元类?相关推荐

  1. python 元类工厂模式_Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  2. 如何创建你的第一个Python元类?

    Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一.通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类.本文介绍 ...

  3. python可以实现什么黑科技_Python黑科技之元类

    Python中的类 在理解元类之前,你需要了解Python中的类.Python中的类借鉴自Smalltalk. 在大多数编程语言中,类只是描述对象生成方式的一段代码,在Python里面看起来也是这样. ...

  4. python进阶与数据操控_零基础机器学习Python进阶:Python操作MySql

    阅读文本大概需要 6 分钟 前言 基础写了十篇,以后会继续更,这是第二篇进阶,文末会放上链接,进阶分成另一个系列,柠檬有时间会整理好菜单栏让大家更方便的阅读基础和进阶,柠檬会把自己在当时做的项目写到进 ...

  5. python进阶路线知乎_Python学习教程(Python学习路线):第九天-面向对象进阶

    面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息.为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程 ...

  6. python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...

    我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...

  7. python中datetime库_一天掌握一个Python库--datetime库

    #一天掌握一个Python库--datetime库 **datatime** 模块题共用一些处理日期,时间和时间间隔的函数.这个模块使用面向对象的交互取代了**time**模块中整形/元组类型的时间函 ...

  8. python 帮助教师_花10分钟写一个Python脚本,搞定了初中老师一下午的工作

    有个朋友是一个初中老师.嗯,教学行政两手抓的那种初中老师. 一天晚上突然微信问我,怎么把图片转成PDF.懵了一下,这个直接打印成PDF不就可以了? 遂告诉他,结果感觉两个人不是一个世界的: 好不容易教 ...

  9. python函数的组成要素_写好一个Python函数的六要素

    Python 虽然好用,但用好真的很难.尤其是函数部分,只要写不好,后面的一连串人都会遭殃.看又看不懂,测试起来也麻烦,维护又维护不动,真是让人头疼. 那怎么写好一个 Python 函数呢?<W ...

最新文章

  1. [欢迎加入]博客园.NET Compact Framework讨论组
  2. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...
  3. 神策数据薛创宇:数据分析与场景实践之“坑位运营”
  4. systemctl 命令完全指南
  5. 关于GiF动图你不知道的9件事
  6. 堆和栈地址——eclipse linux实践
  7. 懂「互联网语」的程序员,是个狠人。
  8. springboot 技术图谱_java后台(Springboot)开发知识图谱高频技术汇总-学习路线...
  9. vue可以多次导入吗_vue组件怎么复用,比如有abc三个组件,b是可复用组件,引入到a和c中,但是怎么才能在a和c中的数?...
  10. java 数组不重复_java如何找出数组中的不重复数字
  11. 对支付宝微信们来说,扫码支付限额 500 元新规意味着什么?
  12. 36.Linux驱动调试-根据oops定位错误代码行
  13. HTC Z710t解锁 获取root权限
  14. 如何在Ubuntu系统下挂载新硬盘(win10+Ubuntu双系统单硬盘挂载新硬盘)
  15. 大数据组件笔记 -- ZooKeeper
  16. java递归把list菜单列表转为菜单树
  17. JAVA关于Calendar类的使用
  18. 【微信小程序】input输入框(87/100)
  19. 如何有效解决电脑桌面开始菜单不见了
  20. android 非SDK API blacklist处理

热门文章

  1. 下面是html5中新增的结构元素的是,HTML5的新的结构元素介绍
  2. ci mysql 缓存_CodeIgniter框架中启用和清除缓存的教程
  3. d3 和echart_D3.js与echart.js的应用场景
  4. java ee会话_Java EE会话技术Cookie和Session
  5. hadoop fs –ls /hbase 无内容_Hadoop大数据实战系列文章之HDFS文件系统
  6. angular复习笔记4-模板
  7. A smooth collaborative recommender system 推荐系统-浅显了解
  8. GitHub学习一-本地电脑与GitHub绑定
  9. matlab曲线拟合 新浪,Matlab曲线拟合
  10. RTT的线程同步篇——事件