Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法、`classmethod`和`staticmethod`是如何在Python中实现的?_Python_Class_Methods_Built In - Fatal编程技术网

方法、`classmethod`和`staticmethod`是如何在Python中实现的?

方法、`classmethod`和`staticmethod`是如何在Python中实现的?,python,class,methods,built-in,Python,Class,Methods,Built In,Python中的方法在什么时候获取get属性-一旦他们在课堂上被定义了?为什么Python允许我定义一个没有任何参数的方法(甚至不是第一个self参数) 我知道如何使用classmethod和staticmethod,而且我知道它们是内置函数,但是这样修饰的函数会发生什么呢 本质上,我想知道类定义和类构造之间发生的“魔力” 您还可以在funcobject.c中查看类和静态方法对象的源代码: 类方法对象定义从第694行开始,而静态方法对象定义从第852行开始。(当methodobject.c也

Python中的方法在什么时候获取
get
属性-一旦他们在课堂上被定义了?为什么Python允许我定义一个没有任何参数的方法(甚至不是第一个
self
参数)

我知道如何使用
classmethod
staticmethod
,而且我知道它们是内置函数,但是这样修饰的函数会发生什么呢

本质上,我想知道类定义和类构造之间发生的“魔力”

您还可以在funcobject.c中查看类和静态方法对象的源代码:

类方法对象定义从第694行开始,而静态方法对象定义从第852行开始。(当methodobject.c也存在时,他们在funcobject.c中有标题为“method”的项目,我确实觉得有点可笑。)

参考@JAB的答案

使用非数据描述符协议,纯Python版本的staticmethod()如下所示:

类静态方法(对象):
“在Objects/funcobject.c中模拟PyStaticMethod_Type()”
定义初始化(self,f):
self.f=f
定义获取(self、obj、objtype=None):
返回自我

使用非数据描述符协议,classmethod()的纯Python版本如下所示:

class类方法(对象):
“在Objects/funcobject.c中模拟PyClassMethod_Type()”
定义初始化(self,f):
self.f=f
定义获取(self、obj、klass=None):
如果klass为无:
klass=类型(obj)
def newfunc(*参数):
返回self.f(klass,*args)
返回newfunc