Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
Python django解构装饰方法_Python_Django - Fatal编程技术网

Python django解构装饰方法

Python django解构装饰方法,python,django,Python,Django,下面是解构类装饰器的源代码,我对类中staticmethod的使用感到有点困惑,因为如果我更改代码klass.\uuuuuu new\uuuuu=staticmethod(\uuuuu new\uuuuuuu)到klass.\uuuuuuu new\uuuuuuuu它仍然可以正常工作,有人能解释一下为什么在这里使用staticmethod吗?目的或用例是什么 来自导入lib导入模块 def可解构(*参数,路径=无): """ 类装饰器,允许序列化装饰的类 通过迁移子系统。 'path`kwarg

下面是解构类装饰器的源代码,我对类中staticmethod的使用感到有点困惑,因为如果我更改代码
klass.\uuuuuu new\uuuuu=staticmethod(\uuuuu new\uuuuuuu)
klass.\uuuuuuu new\uuuuuuuu
它仍然可以正常工作,有人能解释一下为什么在这里使用staticmethod吗?目的或用例是什么

来自导入lib导入模块
def可解构(*参数,路径=无):
"""
类装饰器,允许序列化装饰的类
通过迁移子系统。
'path`kwarg指定导入路径。
"""
def装饰器(klass):
定义(cls,*ARG,**kwargs):
#我们捕获参数以使返回它们变得微不足道
obj=超级(klass,cls)。\uuuu新的\uuuuu(cls)
对象构造函数参数=(参数,kwargs)
返回obj
def解构(obj):
"""
返回3元组的类导入路径、位置参数、,
和关键字参数。
"""
#回退版本
如果路径:
模块名称,名称=path.rpartition('.')
其他:
模块名称=对象__
名称=对象类名称__
#确保它确实存在,而不是内部类
模块=导入模块(模块名称)
如果不是hasattr(模块,名称):
升值误差(
“在%s中找不到对象%s。\n”
“请注意,您无法序列化内部文件之类的内容”
“类。请将对象移动到主模块中”
“要使用迁移的正文。\n”
“有关详细信息,请参阅”
"https://docs.djangoproject.com/en/%s/topics/migrations/#serializing-价值观”
%(名称、模块名称、获取文档版本())
返回(
路径或“%s.%s%”(对象类、模块、名称),
对象构造函数参数[0],
对象构造函数参数[1],
)
klass.\uuuuu new\uuuuu=静态方法(\uuuuu new\uuuu)
#克拉斯。新的__
#向新类添加解构方法
klass.deconstruct=解构
返回克拉斯
如果不是args:
返回装饰器
返回装饰符(*args)
#测试班
@解构的
A类:
定义初始值(self,a,*args,c=None,**kwargs):
self.a=a
self.c=c
如果“名称”=“\uuuuuuuu主要”:
a=a(10,c=100,f=10)
p、 args,kwargs=a.deconstruct()#uuu main_uuu.a(10,{'c':100,'f':10}
打印(p、args、kwargs)
b=A(5,c=10,f=200)
pb,args_b,kwargs_b=A.解构(b)
print(pb,args_b,kwargs_b)#____.main__.A(5,){'c':10,'f':200}

默认情况下,该方法是静态的:

\uuuu new\uuuuu()
是一个静态方法(特殊情况下,您不需要声明它),它将请求实例的类作为其第一个参数

_

所以
klass中的
staticmehthod
。\uuuu new\uuuu=staticmethod(\uuu new\uuuu)
只是明确地说它是一种静态方法