免费的单身汉RainsdRop 2023-03-15 16:03 采纳率: 25%
浏览 26

Python代码的执行顺序(包含类及其魔术方法)

想问一下Python的代码运行顺序。
就下面这段代码:


class Enum(type):
    _init = {}
    print("40:I'm Enum")
    def __init__(self, name, base, class_dict):
        super(Enum, self).__init__(name, base, class_dict)
        print(id(self))

    def __new__(cls, *args, **kwargs):
        c = super().__new__(cls, *args, **kwargs)
        print('47:enum')
        print(args, kwargs)
        print(id(cls), id(c))
        return c


class Server(object, metaclass=Enum):
    print("54:I'm Server")
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def __new__(cls, *args, **kwargs):
        c = super().__new__(cls)
        print('61:Server')
        return c


class SingleMetaClass(type):
    print("66:I'm SingleMetaClass")
    _dct = {}
    _init = {}

    def __init__(self, class_name, base, class_dict):
        self._init[self] = class_dict.get('__init__', None)
        super(SingleMetaClass, self).__init__(class_name, base, class_dict)

    def __call__(self, *args, **kwargs):
        if self._init[self] is None:
            key = self
        else:
            key = (self, args, repr(kwargs))
        if self._dct.get(key) is None:
            self._dct[key] = super().__call__(*args, **kwargs)
        return self._dct[key]


class Coon(metaclass=SingleMetaClass):
    print("85:Coon")
    def __init__(self, a, b):
        print(a, b)


if __name__ == '__main__':
    Server('localhost', '8000')
    print(Coon(1, b=2))
    print(Coon(1, b=2))
    print(Coon(1, 3))

运行结果:

img

通过结果解释运行顺序即可,感谢。

之前看了这篇文章https://blog.csdn.net/weixin_44793743/article/details/126336444
结果还是有些问题。

  • 写回答

4条回答 默认 最新

  • 於黾 2023-03-15 16:18
    关注

    首先,class中有静态的代码块,所以class一加载print就开始执行了
    最先执行的是Enum,因为它写在最前面,最先加载,所以先打印40:
    然后是54:
    这里使用了MetaClass元类,它的创建过程本身就很复杂,先创建父类,再利用父类对象创建子类
    在创建过程中,new方法在创建之前执行,init方法在创建之后执行
    注意,一直到此时Server类都没有真正被创建,所以它的new并不执行
    前面都走完了才开始加载后面两个类,执行顺序和前面类似
    要一直到Server('localhost', '8000')创建一个实例,它自己的new才会执行,输出一个61:
    再后面是创建coot时执行它自身的new方法

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月15日

悬赏问题

  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能
  • ¥20 关于多单片机模块化的一些问题
  • ¥30 seata使用出现报错,其他服务找不到seata
  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取