认识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()
输出结果:
1010
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
有不对的地方欢迎指正 (*^__^*)