python函数调用堆栈过程_python - 元类和何时/如何调用函数 - 堆栈内存溢出

我正在尝试了解元类在python 3中的工作方式。我想知道的是:调用哪些函数,按什么顺序以及它们的签名和返回。

例如,我知道当使用元metaclass, name_of_subclass, bases参数作为实例来实例化具有metaclass, name_of_subclass, bases会调用__prepare__ metaclass, name_of_subclass, bases并且返回一个字典metaclass, name_of_subclass, bases该字典表示实例化对象的未来命名空间。

我觉得我很了解__prepare__在此过程中的步骤。 不过,我没有的是__init__ , __init__ __new__和__call__ 。 他们的观点是什么? 他们返回什么? 他们如何相互呼唤,或者总体而言,流程如何进行? 目前,我仍在了解何时调用__init__ 。

这是我一直在弄乱的一些代码来回答我的问题:

#!/usr/bin/env python3

class Logged(type):

@classmethod

def __prepare__(cls, name, bases):

print('In meta __prepare__')

return {}

def __call__(subclass):

print('In meta __call__')

print('Creating {}.'.format(subclass))

return subclass.__new__(subclass)

def __new__(subclass, name, superclasses, attributes, **keyword_arguments):

print('In meta __new__')

return type.__new__(subclass, name, superclasses, attributes)

def __init__(subclass, name, superclasses, attributes, **keyword_arguments):

print('In meta __init__')

class Thing(metaclass = Logged):

def __new__(this, *arguments, **keyword_arguments):

print('In sub __new__')

return super(Thing, this).__new__(this)

def __init__(self, *arguments, **keyword_arguments):

print('In sub __init__')

def hello(self):

print('hello')

def main():

thing = Thing()

thing.hello()

if __name__ == '__main__':

main()

通过这个和一些谷歌搜索,我知道__new__是一个静态方法,该方法返回某个对象的实例(通常是定义了__new__的对象,但并非总是如此),并且在创建__init__会调用该实例。 按照这种逻辑,我对为何未调用Thing.__init__()感到困惑。 有人可以照亮吗?

该代码的输出显示“ hello”,因此正在创建Thing的实例,这进一步使我对init感到困惑。 这是输出:

In meta __prepare__

In meta __new__

In meta __init__

In meta __call__

Creating

In sub __new__

hello

理解元类的任何帮助将不胜感激。 我已经阅读了很多教程,但是我错过了其中一些细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值