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来代表自身类,外部访问时可以直接通过类名进行访问
下面来看看代码,主要关注使用方法及改变成员变量的影响
test = demo() # 初始化实例test
输出结果:
10
10
11
10
######################################################################
输出结果:
10
10
12
12
######################################################################
输出结果:
10
10
13
13
有不对的地方欢迎指正 (*^__^*)
在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
有不对的地方欢迎指正 (*^__^*)
相关文章推荐
- python @property,@staticmethod,@classmethod 使用例子
- @classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为:
- Python使用@staticmethod和@classmethod分别建立方法
- python @classmethod和@staticmethod 装饰器使用
- Python学习笔记 --- @staticmethod 和 @classmethod方法的使用
- 【再回首Python之美】【类-三种方法】绑定方法、@staticmethod、@classmethod的基本使用
- python 类中@staticmethod,@classmethod和实例方法
- python staticmethod和classmethod(转载)
- python -- @classmethod @staticmethod区别和使用
- 装饰器语法糖(@staticmethod/@classmethod/@property)原理剖析及使用场景说明
- 粗解python的@classmethod和@staticmethod及普通实例方法
- python的静态方法以及@staticmethod或@classmethod的区别
- 【Python笔记】装饰器语法糖(@staticmethod/@classmethod/@property)原理剖析及使用场景说明
- Python中classmethod与staticmethod区别
- 飘逸的python - @staticmethod和@classmethod的作用与区别
- python @staticmethod和@classmethod的作用与区别
- python的 @staticmethod,@classmethod和@property的区别
- Python 实例方法、@staticmethod和@classmethod
- Python 实例方法、@staticmethod和@classmethod
- Python @classmethod 和 @staticmethod的比较