gpt4 book ai didi

python - @classmethod 的位置

转载 作者:太空狗 更新时间:2023-10-29 19:31:32 27 4
gpt4 key购买 nike

装饰器classmethod的源代码在python源码在哪里。具体来说,我无法找到它在 2.7.2 版中定义的确切文件

最佳答案

我没有回答你的问题 - 但下面的代码显示了用纯 Python 编写的等同于 classmethod 的装饰器 - 因为源代码中的那个是 C 语言,在 Python source code 内正如 Mishna 在他的回答中所说的那样(为 GitHub 上的 cPython 开发分支更新了链接)。

因此,类方法的想法是使用“描述符”机制,如 Python's data model 中所述 - 并使 __get__ 方法确实返回一个函数对象,调用时将调用第一个参数预填充的原始方法:

class myclassmethod(object):
def __init__(self, method):
self.method = method
def __get__(self, instance, cls):
return lambda *args, **kw: self.method(cls, *args, **kw)

在 Python 控制台上:

>>> class MyClass(object):
... @myclassmethod
... def method(cls):
... print cls
...
>>>
>>> m = MyClass()
>>> m.method()
<class '__main__.MyClass'>
>>>

*** 编辑 - 更新 ***

O.P. 进一步问道“如果我希望装饰器也接受一个参数,init 的正确格式是什么?”-

在那种情况下,不仅 __init__ 必须更改 - 接受配置参数的装饰器实际上在“两个阶段”中被调用 - 第一个注释参数,并返回一个可调用的- 第二次调用仅接受实际将被装饰的函数。

有几种方法可以做到这一点——但我认为最直接的方法是使用一个函数返回上面的类,例如:

def myclasmethod(par1, par2, ...):
class _myclassmethod(object):
def __init__(self, method):
self.method = method
def __get__(self, instance, cls):
# make use of par1, par2,... variables here at will
return lambda *args, **kw: self.method(cls, *args, **kw)
return _myclassmethod

关于python - @classmethod 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247625/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com