10

这是一个学术问题,而不是一个实际问题。我正在尝试深入研究 Python 的基础,我想知道:如果我愿意,我可以在纯 Python 中实现staticmethod和装饰器吗?classmethod

因为staticmethod也许我可以保留对原始函数的引用并将其称为省略第一个参数?

因为classmethod也许我可以保留对原始函数的引用并调用它传递第一个参数的类型,而不是参数本身?(我将如何处理在课堂上直接调用它?)

同样,我并不是想在我的程序中实际实现它。我想了解语言是如何工作的。如果有可能,我将非常感谢代码示例。如果没有,我会很感激解释为什么理论上不能做到。谢谢!

编辑:感谢您的回答和对描述符协议的参考!为了进一步扩展我对 Python 的理解,我想再问两件事:

  • 这是否可以在没有描述符协议的情况下完成,例如通过在我们的类中实现 __ call __ 特殊方法?

  • 描述符协议在 Python 2.7 和 Python 3.x 中的工作方式是否相同?

再次感谢!

4

2 回答 2

12

文档中有示例:

class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        return self.f

和:

class ClassMethod(object):
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc
于 2012-08-01T22:57:36.767 回答
1

您应该接受 JF Sebastian 的回答,因为它直接回答了您的问题,但是提出这个问题意味着您想了解可以在此处阅读的描述符协议,这是用于实现这些和其他重要 Python 内部的东西(并且可以谨慎使用时在您自己的代码中很有用)。property, 和常规的 ol' 绑定方法是使用描述符协议编写的其他东西。

您应该检查一下,当您第一次阅读它时,它并不那么简单,但它会点击。

于 2012-08-01T23:43:02.597 回答