python classmethod和
这两个装饰器是Python自带的,虽然一直都知道装饰器是怎么用的,但是确实不知道何时去使用它们,今天看到某人用到了,又看了一遍,才有所收货.
其实我们几乎可以不用这两个装饰器,总有办法解决问题,所以让我定义装饰起的用途,那么就一点,让代码变得整洁,少些代码.
以前我一直不知道classmethod的用法,有它没它都是一样,举个例子
class A(object):
bar = 1
def foo(self):
print 'foo'
@classmethod
def class_foo(cls):
print 'class_foo'
print cls.bar
cls().foo()
上面代码如果添加了装饰器@classmethod
就这样来调用:
A.class_foo()
如果没有装饰器就这样写
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装饰器其实比较好理解,还是先看例子,有装饰器的用法
class A(object):
bar = 1
def foo(self):
print 'foo'
@staticmethod
def static_foo():
print 'static_foo'
print A.bar
A.static_foo()
相同代码没有用装饰器
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思想,我就没多大感悟了,但是建议少用.
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341