如何让classmethod只允许使用用类对象来调用
Django REST framework里面有这样一段代码,在网上查@classonlymethod的意思是使得classmethod只允许使用用类对象来调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | @classonlymethod def as_view( cls , * * initkwargs): """ Main entry point for a request-response process. """ for key in initkwargs: if key in cls .http_method_names: raise TypeError( "You tried to pass in the %s method name as a " "keyword argument to %s(). Don't do that." % (key, cls .__name__)) if not hasattr ( cls , key): raise TypeError( "%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % ( cls .__name__, key)) def view(request, * args, * * kwargs): self = cls ( * * initkwargs) if hasattr ( self , 'get' ) and not hasattr ( self , 'head' ): self .head = self .get self .request = request self .args = args self .kwargs = kwargs return self .dispatch(request, * args, * * kwargs) view.view_class = cls view.view_initkwargs = initkwargs # take name and docstring from class update_wrapper(view, cls , updated = ()) # and possible attributes set by decorators # like csrf_exempt from dispatch update_wrapper(view, cls .dispatch, assigned = ()) return view |
classonlymethod实现代码如下:
1 2 3 4 5 | class classonlymethod( classmethod ): def __get__( self , instance, cls = None ): if instance is not None : raise AttributeError( "This method is available only on the class, not on instances." ) return super (classonlymethod, self ).__get__(instance, cls ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了