码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2.1.7 面向对象:类实例化(元类)(Python)


    本文来自异想之旅公开发布的Python教程,原文地址:https://www.yuque.com/yxzl/python

    这节的确是太难了点……新手快跑!!

    上一篇我们将到,Python 中一切皆对象。所以类本身(不是实例化出来的对象)本身也是一个对象。类的类型是 Type。

    type(对象) 可以查看对象的类型。

    class A:
        ...
    
    print(A)  # 输出:
    print(type(A))  # A 的类型 # 输出:
    
    • 1
    • 2
    • 3
    • 4
    • 5

    既然类是type类型的,我们也可以通过实例化type来动态建立一个类。

    先看看type定义类时初始化函数的重载:

    def __init__(self, __name: str, __bases: tuple[type, ...],
                 __dict: dict[str, Any], **kwds: Any) -> None:
        ...
    
    • 1
    • 2
    • 3

    type(名字, 继承关系(被继承的父类), 一个包含着属性和方法的字典)可以建立一个类。

    Student = type('Student', (object, ), {'name': 'test'})
    
    print(Student().name)  # 输出:test
    
    • 1
    • 2
    • 3

    既然我们可以通过实例化type来建立类,我们也可以通过继承type来获得一个可以用来建立类的类。这种类称为元类。

    class MyMetaclass(type):
    
        def __new__(cls, name, bases, dict):
            return type.__new__(cls, name, bases, dict)
    
    • 1
    • 2
    • 3
    • 4

    我们可以通过该元类来建立类。

    class MyMetaclass:
        ...
    
    
    class MyClass(metaclass=MyMetaclass):
        ...
    # 上面两行等价于下面一行
    MyClass = MyMetaclass('MyClass', (object, ), {})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    所以说,建立一个类class MyClass: ...相当于class MyClass(object, metaclass=type): ...。

    一个例子:

    class MyMetaclass(type):
    
        def __new__(cls, name, bases, dict):
            dict['test'] = lambda self, x: x + 1
            # lambda 匿名函数,具体请见《函数(二)》章节
            # 相当于下面的写法
            def foo(self, bar):
                return bar - 1
            dict['test2'] = foo
            return type.__new__(cls, name, bases, dict)
    
    
    class MyClass(metaclass=MyMetaclass):
        ...
    
    
    print(MyClass().test(1))  # 输出:2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    论文浅尝 | KR-GCN: 知识感知推理的可解释推荐系统
    k8s部署单点的mysql实例
    如何将项目打包上传到NuGet服务器(图文教程)?
    阈值与平滑处理
    1119 Pre- and Post-order Traversals
    vue课程75 axios是只专注于网络请求的库
    仿游戏热血江湖游戏类22(得到物品方法2)
    Jmeter 性能-死锁问题定位+分析
    基于深度学习网络的手势识别算法matlab仿真
    R语言ggplot2可视化:使用ggpubr包的ggviolin函数可视化小提琴图、设置add参数在小提琴内部添加箱图
  • 原文地址:https://blog.csdn.net/weixin_44495599/article/details/126184914
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号