欢迎各位兄弟 发布技术文章
这里的技术是共享的
要在类中使用静态方法,需在静态方法前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。
使用静态方法的好处:其函数不需要self参数,可以通过类调用该方法,不需要定义该类实例(当然通过类实例调用也没有问题)。
转身投入Python有一周左右的日子了。这一周不能算是很仔细的去研究它,用比喻的话,还在学习骑车的阶段,未及拆车和造车这样高深。
但此时就有了让我产生纠结之处。查阅了一些已对这点做比较的博文,对其有所领悟。其实,问题是先来自于Python具有魅力的Decorator。其内置的三个Decorator让我有些许不解。
@staticmethod
@classmethod
@proptey
本身来自于Java的先入为主,让我对类方法和静态方法没了区别的概念。但在前人的博文中找到一个例子,让我略有了些领悟
class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a = A() a.foo(1) a.class_foo(1) A.class_foo(1) a.static_foo(1) A.static_foo(1)
输出的结果为
executing foo(<__main__.A object at 0x004E0730>,1) executing class_foo(<class '__main__.A'>,1) executing class_foo(<class '__main__.A'>,1) executing static_foo(1) executing static_foo(1)
首先,实例方法,很清楚,打印了该实例化的对象的信息(在内存中的地址)
然后是类方法,cls这个参数打印出的是 类A这个对象(Python中任何都是对象),不管是否是实例化的调用
最后是静态方法,与调用也无关,并且这个方法不依赖任何对象。
一些粗浅的认识:
似乎就是这些领悟,后面遇到问题再来更新吧
来自 http://www.cnblogs.com/artoruis/archive/2011/09/13/2174906.html
class Kls(object):
def __init__(self, data):
self.data = data
def printd(self):
print(self.data)
ik1 = Kls('arun')
ik2 = Kls('seema')
ik1.printd()
ik2.printd()
def get_no_of_instances(cls_obj):
return cls_obj.no_inst
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls))
def iget_no_of_instance(ins_obj):
return ins_obj.__class__.no_inst
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print iget_no_of_instance(ik1)
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
@classmethod
def get_no_of_instance(cls_obj):
return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()
IND = 'ON'
def checkind():
return (IND == 'ON')
class Kls(object):
def __init__(self,data):
self.data = data
def do_reset(self):
if checkind():
print('Reset done for:', self.data)
def set_db(self):
if checkind():
self.db = 'new db connection'
print('DB connection made for:',self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()
IND = 'ON'
class Kls(object):
def __init__(self, data):
self.data = data
@staticmethod
def checkind():
return (IND == 'ON')
def do_reset(self):
if self.checkind():
print('Reset done for:', self.data)
def set_db(self):
if self.checkind():
self.db = 'New db connection'
print('DB connection made for: ', self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()
class Kls(object):
def __init__(self, data):
self.data = data
def printd(self):
print(self.data)
@staticmethod
def smethod(*arg):
print('Static:', arg)
@classmethod
def cmethod(*arg):
print('Class:', arg)
>>> ik = Kls(23)
>>> ik.printd()
23
>>> ik.smethod()
Static: ()
>>> ik.cmethod()
Class: (<class '__main__.Kls'>,)
>>> Kls.printd()
TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)
>>> Kls.smethod()
Static: ()
>>> Kls.cmethod()
Class: (<class '__main__.Kls'>,)
半尾 2010年06月05日 星期六 18:32 | 4212次浏览 | 1条评论
不错的问题