前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python classmethod和

python classmethod和

作者头像
py3study
发布2020-01-06 14:35:38
3600
发布2020-01-06 14:35:38
举报
文章被收录于专栏:python3python3

   这两个装饰器是Python自带的,虽然一直都知道装饰器是怎么用的,但是确实不知道何时去使用它们,今天看到某人用到了,又看了一遍,才有所收货.

   其实我们几乎可以不用这两个装饰器,总有办法解决问题,所以让我定义装饰起的用途,那么就一点,让代码变得整洁,少些代码.

   以前我一直不知道classmethod的用法,有它没它都是一样,举个例子

代码语言:javascript
复制
class A(object):  
    bar = 1  
    def foo(self):  
        print 'foo'  
    @classmethod  
    def class_foo(cls):  
        print 'class_foo'  
        print cls.bar  
        cls().foo()

上面代码如果添加了装饰器@classmethod 

就这样来调用:

代码语言:javascript
复制
A.class_foo()

如果没有装饰器就这样写

代码语言:javascript
复制
class A(object):  
    bar = 1  
    def foo(self):  
        print 'foo'   
    
    def class_foo(self):  
        print 'class_foo'  
        print bar  
        self.foo() 
a=A()
a.class_foo()

其实看起来没多大差别,甚至没有变得更优雅,仿佛不知道是不是真有什么特殊效果,其实是有的.一般会有几种情况适合使用classmethod装饰器

 1某个类实例化会实例化太多的数据,而你只用某个方法用classmethod就可以绕过去

 2当有两个类的时候,一个类只是懒得再写一遍某个方法,调用另外一个类的方法却又不想实例化,或者说只是想让代码看起来更好看

staticmethod装饰器其实比较好理解,还是先看例子,有装饰器的用法

代码语言:javascript
复制
class A(object):  
    bar = 1  
    def foo(self):  
        print 'foo'  
 
    @staticmethod  
    def static_foo():  
        print 'static_foo'  
        print A.bar   
  
A.static_foo()

相同代码没有用装饰器

代码语言:javascript
复制
class B(object):  
    bar = 1  
    def foo(self):  
        print 'foo'  
   
    def static_foo(self):  
        print 'static_foo'  
        print bar  
  
  
b=B()
b.static_foo()

看起来也没多大差别,但是a=A()是没有实例化static_foo()的,b=B()却实例化了static_foo,看起来仿佛没什么用,其实是没什么用,从代码角度来看,只是可以少实例化一些方法吧,别人都说符合oop思想,我就没多大感悟了,但是建议少用.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档