python元类模型和class语句协议

这篇具有很好参考价值的文章主要介绍了python元类模型和class语句协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 python元类模型和class语句协议

学习python的类型模型和class语句协议。class语句末尾自动调用type()创建类对象并且赋值给类名称。

1.1 类是类型的实例

python3.x中,用户定义的类对象是名为type的对象的实例,type本身是一个类;

python2.x中,新式类继承object,它是type的一个子类;传统类是type的一个实例;

type()内置函数返回任何对象的类型。

1.1.1 python3.x

顶层的type对象创建具体的类型,具体的类型创建实例。

>>> type([])#list类创建列表实例(具体类创建实例)
<class 'list'>
>>> type(type([]))#type类创建list类(type类创建具体类)
<class 'type'>
>>> type(list)
<class 'type'>
>>> type(type)
<class 'type'>

1.1.2 python2.x

type是一种内置对象,位于类型层级的顶层,用来构建类型。

>>> type([])
<type 'list'>
>>> type(type([]))
<type 'type'>
>>> type(list)
<type 'type'>
>>> type(type)
<type 'type'>

1.1.3 python3.x自定义类

(1) 类型由派生自type的类定义;

(2) 用户定义的类是类型类的实例;

(3) 用户定义的类是产生它们自己的实例的类型。

>>> class C1:pass
>>> type(C1)
<class 'type'>
>>> type(C1())
<class '__main__.C1'>

1.1.4 __class__

类是type类的实例,类产生自的实例对象。

obj.__class__,返回obj所属的类,obj可以是实例对象,或者类对象。

python3.x

>>> class C:pass

>>> c1=C()
>>> type(c1)
<class '__main__.C'>
>>> c1.__class__
<class '__main__.C'>
>>> type(C)
<class 'type'>
>>> C.__class__
<class 'type'>
>>> c1
<__main__.C object at 0x00000288F3360A90>
>>> C
<class '__main__.C'>

python2.x新式类

>>> class C(object):pass

>>> c1=C()
>>> type(c1)
<class '__main__.C'>
>>> type(C)
<type 'type'>
>>> c1.__class__
<class '__main__.C'>
>>> C.__class__
<type 'type'>
>>> c1
<__main__.C object at 0x0000000003F70408>
>>> C
<class '__main__.C'>

python2.x传统类

>>> class C:pass

>>> c1=C()
>>> type(c1)
<type 'instance'>
>>> type(C)
<type 'classobj'>
>>> c1.__class__
<class __main__.C at 0x00000000037A9AC8>
>>> C.__class__

Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    C.__class__
AttributeError: class C has no attribute '__class__'

1.2 元类是type的子类

python3.x中,类是type类的实例。

(1) type是产生用户定的类的一个类;

(2) 元类是type类的一个子类;

(3) 类对象是type类的一个实例,或一个子类;

(4) 实例对象产生自一个类。

用户定义的类创建子一个用户定义的元类,而不是type类,来控制创建类及扩展其行为的方式。

1.3 class语句协议

子类化type类以定制它。把一个类的创建指向元类,而不是默认的type。

理解class语句如何完成工作。

class语句末尾,自动执行type()方法,创建类对象赋值给类名。

class = type(classname,superclasses,attributedict)

type对象定义__call__运算符重载方法,调用type对象时,执行下面两个方法:

(1) type.__new__(typeclass,classname,superclasses,attributedict)

(2) type.__init__(class,classname,superclasses,attributedict)

__new__方法创建并返回新的class对象,__init__()方法初始化新创建的对象。

type的元类子类定制type的钩子。

>>> class A:pass

>>> class B(A):
    name='梯阅线条'
    def meth(self,arg):
        pass

# class 语句末尾自动调用type(),产生class 对象
B=type('B',(A,),{'name':'梯阅线条','meth':meth,'__module__':'__main__'})

用法

name=type(name, bases, dict) -> a new type

描述

手动调用type创建类对象。

name:字符串,类名;

bases:元组,存放基类;

dict:类属性字典;

返回:创建名字为name的类对象,类型为type类。

__base__获取类的直接超类组成的元组,参考《python命名空间字典》

示例

>>> class ClassB:
    name='梯阅线条'
>>> ClassB
# 自动调用 type() 创建类对象 赋值给 ClassB
<class '__main__.ClassB'>
>>> type(ClassB)
# 类对象类型为 type类 类型
<class 'type'>
>>> type(ClassB())
# 实例对象类型为 ClassB类 类型
<class '__main__.ClassB'>
>>> ClassB.__bases__
# 基类为 object
(<class 'object'>,)
>>> ClassB.name
# 类属性
'梯阅线条'

等效于文章来源地址https://www.toymoban.com/news/detail-810469.html

>>> ClassB=type('ClassB',(object,),{'__module__':'__main__','name':'梯阅线条'})
>>> ClassB
<class '__main__.ClassB'>
>>> type(ClassB)
<class 'type'>
>>> type(ClassB())
<class '__main__.ClassB'>
>>> ClassB.__bases__
(<class 'object'>,)
>>> ClassB.name
'梯阅线条'

到了这里,关于python元类模型和class语句协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]

    分类目录:《系统学习Python》总目录 函数装饰器是如此有用,以至于Python2.X和Python3.X都扩展了这一模式,允许装饰器应用于类和函数。简而言之,类装饰器类似于函数装饰器,但它们是在一条 class 语句的末尾运行,并把一个类名重新绑定到一个可调用对象。同样,它们可以

    2024年02月19日
    浏览(28)
  • Python黑魔法揭秘:装饰器、生成器、异步编程、GIL、描述符和元类

    Python中的某些特性被看作是“黑魔法”,原因在于它们的强大功能和复杂性。接下来,让我们深入探索这些特性。 装饰器是修改函数或类行为的强大工具,它提供了一种可读性强、代码重用的方式来增强或修改函数或类的行为。装饰器就像一个包裹原函数或类的外壳,能够在

    2024年02月14日
    浏览(32)
  • Python_17 OSI模型和HTTP协议

    一、查缺补漏 1. Wireshark 抓报文 2. 要学习的所有博客: http://testingpai.com/member/haili/articles 二、OSI模型 1. 物理层 2. 数据链路层 3. 网络层 4. 传输层:TCP(靠谱的传输协议,传输有限) UDP(广播协议会丢包,不是很靠谱,但是可以传输很大的内容,如视频) 5. 会话层 6. 表示层

    2024年02月02日
    浏览(24)
  • python-Excel数据模型文档转为MySQL数据库建表语句(需要连接数据库)-工作小记

    将指定Excel文档转为create table 建表语句。该脚本适用于单一且简单的建表语句 呈现效果  代码   仅作为笔记记录,如有问题请各位大佬来指导 

    2024年02月14日
    浏览(38)
  • Vela-OS: 记录一个class层,处理MSC协议的bug

    1. 源文件 nuttxdriversusbdevusbmsc_scsi.c 2. 问题描述 对于INQUIRY指令,长度一般是6个字节,cdblen字段嵌入在CBW数据包中,如下: 命令阶段的CBW数据包: 55 53 42 43  60 2a c0 8b  24 00 00 00  0x80 0x0 [06] 12 ... 但是HOST也有可能下发12字节,比如在格式化盘符的时候: 命令阶段的CBW数据包:

    2024年04月16日
    浏览(23)
  • 元类(一)

    元类在工作中一般很少用到,除非手写框架 1、__new__创建类时调用 2、__call__创建与初始化类实例时调用  

    2024年02月11日
    浏览(30)
  • 友元函数与友元类

    实验介绍 私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。声明为友元函数或友元类后就可以直接访问类中所有成员,但同时也破坏了类的封装性。 为什么在模板篇中讲解友元函数和友元类呢? 答

    2024年01月16日
    浏览(28)
  • 静态成员,友元函数,友元类

    🐶 博主主页: @ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰

    2024年01月22日
    浏览(29)
  • TP6 使用闭合语句查询多个or的模型语句

    需要传入参数查询的,可以参照下面的:         查询出学校名称和昵称中有中学的所有学校

    2024年02月11日
    浏览(38)
  • 使用元类实现Django的ORM

    如图: 代码运行结果:

    2024年03月21日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包