您的位置:首页 > 编程语言 > Python开发

Python中使用@staticmethod 和 @classmethod 装饰器

2017-04-05 15:13 591 查看
认识static

在java中有static关键字,标识静态变量,或者静态方法,也叫类变量、类方法,与一般的实例变量区别在于,它是类共有的,可以通过类名直接访问,并且永远保持着最新修改的值,而成员变量则是类实例特有的一个副本,通过类的实例进行访问,当前类实例修改了成员变量的值只会对本实例有用,并不会影响其他类实例所持有的变量的值

在python中则使用@staticmethod 或者 @classmethod来完成类似的事情!

1、在python中定义类和方法后,一般是通过类的对象来访问具体的方法,在定义普通成员方法时,第一个参数默认是self,代表本类实例

2、如果使用@staticmethod来装饰一个方法,则不需要传递self,外部访问时可以直接通过类名进行访问

3、如果使用@classmethod来装饰一个方法,不需要传递self,但需要传递一个cls来代表自身类,外部访问时可以直接通过类名进行访问

下面来看看代码,主要关注使用方法及改变成员变量的影响

class demo(object):

__c = 10; # 定义一个private的变量

def get_c(self):
print self.__c
return self.__c

def add(self,a):
"""
这个是普通方法,我们改变了一次__c的值,但这只对当前的类实例有效
:param a:
:return:
"""
self.__c = 11
return self.__c + a

@staticmethod
def add2(a):
"""
这是一个静态方法,我们改变了一次__c的值,这个改变对所有类实例都有效
:param a:
:return:
"""
demo.__c = 12 # 改变了__c的值
return demo.__c + a

@classmethod
def add3(cls,a):
"""
这是一个类方法,我们改变了一次__c的值,这个改变对所有类实例都有效
:param a:
:return:
"""
cls.__c = 13 # 改变了__c的值
return cls.__c + a
##################################################################################
test = demo() # 初始化实例test
test1 = demo() # 初始化实例test1


test.get_c() #获取__c 变量值
test1.get_c() #获取__c 变量值

test.add(2) # 通过test 实例调用普通方法add改变__c的值,它并不会影响到test1的__c的值

test.get_c()
test1.get_c()

输出结果:

10

10

11

10
######################################################################

test = demo() # 初始化实例test
test1 = demo() # 初始化实例test1
test.get_c() #获取__c 变量值
test1.get_c() #获取__c 变量值

demo.add2(2) # 通过类名直接调用add2方法,改了__c的值,这对所有的实例都有效

test.get_c()
test1.get_c()

输出结果:

10

10

12

12

######################################################################

test = demo() # 初始化实例test
test1 = demo() # 初始化实例test1
test.get_c() #获取__c 变量值
test1.get_c() #获取__c 变量值

demo.add3(2) # 通过类名直接调用add3方法,改了__c的值,这对所有的实例都有效

test.get_c()
test1.get_c()

输出结果:

10

10

13

13

有不对的地方欢迎指正 (*^__^*) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: