python classmethod_python classmethod和 staticmethod的心得

这两个装饰器是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思想,我就没多大感悟了,但是建议少用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值