Python中type和元类的用法 - vip共享吧
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们


导航菜单
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们
Python

Python中type和元类的用法

2024/9/6 韩俊  Python教程 799 0

我们知道 Python 是动态语言,动态语言和静态语言最大的不同就是函数和类的定义,在动态语言中函数和类的定义不是编译时产生的,而是在运行时动态创建的,所以我们就没必要先定义好一个类,我们可以在代码的任何地方根据需要来随时的定义类,Python的 type 和 metaclass 可以帮我们动态创建一个类。

type 是 Python 内置的函数对象类,这个类很特殊,我们可以把他当做函数来看待, 我们查看 type 类的源码,发现他的构造函数的声明为: type(object) -> the object's type, type(name, bases, dict) -> a new type 。也就是说当给它传入一个参数时,它返回这个参数所属的类型; 当传入三个参数时,它返回一个新的类型(大家可以认为是一个新的类),这样我们就可以用这个类来创建对象了。

metaclass 是元类,我们可以使用 metaclass 创建出类,然后根据这个类创建对象,这就和用 type 实现一样的效果。

使用 type 创建类

要使用 type 创建一个类,我们需要对 type 类构建的对象依次传入3个参数: class的名称,继承的父类集合(可以继承多个父类,是个 tuple类型),class 的方法名称与函数绑定。比如下面的例子我们把函数 func 绑定到方法名 Human 上。

def func(self, name):  # 在类之前定义要绑定的函数
    print("I'm " + name)

Human = type('Human', (object,), {"talk": func})  # 创建 Human 类,该类继承 object,有一个talk函数
ruhua = Human()
ruhua.talk("ruhua")

通过 type 函数创建的类和直接写 class 定义的类是完全一样的,实际上 Python 解释器遇到 class 定义时,仅仅是扫描一下class 定义的语法,然后调用 type 函数创建出 class。 我们在使用 type 创建类时,完全可以后期动态绑定函数和属性,要注意给类动态绑定和给类的对象动态绑定的区别。

def func(self):  # 在类之前定义要绑定的函数
    print(u"我是类绑定的")

def func2():
    print(u"我是某个对象绑定的")

Human = type('Human', (object,), {})
Human.func = func
Human.data = "我是类的属性"

ruhua = Human()
ruhua.func2 = func2
ruhua.data2 = "我是某个对象的属性"

ruhua.func()        # 正确
print(ruhua.data)   # 正确
ruhua.func2()       # 正确
print(ruhua.data2)  # 正确

zhaoritian = Human()
zhaoritian.func()        # 正确
print(zhaoritian.data)   # 正确
zhaoritian.func2()       # 错误
print(zhaoritian.data2)  # 错误

使用 metaclass 创建类

除了使用 type 动态创建类以外,还可以使用 自己定义的元类(metaclass)来创建类, 自己定义一个元类,首先该类要继承 type 类,我们还需要定义一个 __new__ 函数, __new__ 函数接收到的参数依次是:当前准备创建的类的对象,类的名字,类继承的父类集合,类的函数集合。 我们在使用 metaclass 创建类,按照默认习惯,metaclass 的类名总是以 Metaclass 结尾,以便清楚地表示这是一个 metaclass。

class MyObjectMetaclass(type):
    def __new__(cls, name, bases, funcs):
        def setdata(self, value):
            self.data = value
        funcs['setdata'] = setdata
        return type.__new__(cls, name, bases, funcs)

class MyObject(object, metaclass=MyObjectMetaclass):
    pass

myobject = MyObject()
myobject.setdata("hello")
print(myobject.data)

在我们项目开发中,我们几乎不会用到本节课所讲的知识,但在阅读其它源码时,我们碰到这种语法要看的明白(下个阶段我们要学习的 web 开发中,orm 的 model 设计经常用到这种语法),大家注意,Python 这种语言很自卑,语言也像人一样,自卑的人都想弄点奇技淫巧,找到机会就装逼,metaclass就是个很好的例子。

本节重要知识点

看的明白 type 创建类的语法。

看的明白使用元类的语法。

点赞:0 分享

上一篇
Python文件处理和输入输出(IO)
下一篇
Python多重继承
作者头像 作者名称 作者性别
韩俊

热门推荐

1 Python中urllib模块详解
2 python搜索模块的路径
3 Python3的dict类型
4 Python异常处理
5 python中collections库详解
6 Python3字符串

评论列表

取消回复

    •  
      Login

      韩俊

      趁你现在还有时间,尽你自己最大的努力,努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。这个世界永远比你想的要更精彩,不要败给生活。

      退出登陆
      • 10076文章
      • 455评论
      • 80微语
  • 广告赞助

  • 二零二五年06月
    一二三四五六日
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
  • 分类

    • 网站模板源码
    • IT技术笔记
    • 好资源分享
    • 共享网络资源
  • 最新文章

      • 幼儿端午祝福语简短句
        • 端午简短祝福语送家人
          • 端午文案祝福语简短励志
            • 经典的黄句子
              • 经典黄色搞笑句子
                • 迷雾通:免费使用的VPN软件
                  • 任推邦:打造你的赚钱新途径!
                    • 任推邦是正规平台吗?任推邦邀请码多少?
  • 热门文章

    • 酷狗音乐VIP账号 酷狗音乐会员账号共享2017.01.29更新
    • 芒果tv vip会员账号 芒果tv会员账号共享2017.01.29更新
    • 爱奇艺vip账号 爱奇艺/PPS会员账号共享2016.12.12更新
    • 优酷/土豆vip会员账号 优酷会员账号共享2017.01.29更新
    • 活动:免费获得爱奇艺VIP/PPS会员账号50天以上的使用权!
    • 酷我音乐VIP账号 酷我音乐会员账号共享2016.12.31更新
    • 暴风影音会员账号 暴风影音会员账号共享2016.12.31更新
    • m1905会员账号 m1905会员账号共享2016.10.21更新
  • 最新评论

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/10.jpg

      你丫的 文章写得太好了 支持下!![F3...

    • https://www.vipshare8.com/content/templates/meta/Static/images/avatar.jpg

      很棒!刚在某网站看到这个,很欣赏,可惜下...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3861064027

      呃呃呃 oooo

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了111:根据激活的时间有一年的有效期!

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=792480561

      到2025就到期了吗?

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      [blockquote]打卡时间:16:...

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/7.jpg

      俊哥,想借用迅雷一用!但需要手机验证!看...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3293901900

      感谢大大的分享

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了好奥v:如果没有解析成功,可以切换接口...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=131241242441

      现在视频解析网站怎么用不了啦?

  • 网站统计 I 当前在线:442人

    • 本站管理:1位
    • 用户总数:591位
    • 置顶文章:2篇
    • 日志总数:10076篇
    • 微语总数:80条
    • 评论总数:455条
    • 标签总数:83条
    • 页面总数:8页
    • 分类总数:14个
    • 链接总数:16条
    • 运行天数:3699天
    • 最后更新:5月26日
    • 登录
    • 注册
    • 找回
    Copyright © 2025vip共享吧网站地图 网站备案豫ICP备19004194号-1

    免责声明:本站资源仅供用于学习和交流,本站部分素材内容来源于网络,如有侵权/投稿等,请及时联系站长.

    • 首页
    • 秒懂百科 秒懂百科
    • 搜索
    • 史上今日

    大家都在搜

    • 咪咕会员账号
    • chatGPT
    • redis
    • javascript教程
    • 腾讯视频会员账号
    • 网盘赚钱
    • 掌阅会员账号
    • 开发工具
    • seo优化
    • 小程序
    • 乐视视频
    • 百度文库下载
    • 微信小程序源码
    • 土豆vip账号共享
    • seo
    • JavaScript
    • 
    • 