1 # -*- coding: UTF-8 -*- 2 # 无论名称是self还是cls,类方法或实例方法都是把第一个参数默认成cls或self,即调用类或调用实例才能使用。 3 4 class JustCounter: 5 publicCount = 0 # 公开属性 6 __secretCount = 0 # 私有属性 7 def count_secret(self): 8 print self.__secretCount 9 def count_public(self): 10 print self.publicCount 11 @staticmethod #静态方法:实例和类都可以调用,因为没有实例和类作为参数引入,所以不能作用于实例或类本身。 12 def func_static(): 13 print ‘func_static work‘ 14 @staticmethod 15 def func_static2(args1,args2): 16 print ‘args1=‘,args1,‘args2=‘,args2 17 @classmethod #类方法:将类本身作为参数引入,实例和类都可以调用,都可以访问类属性,不能访问实例属性 18 def func_class(cls): 19 cls.publicCount = 888 20 print ‘func_class work‘ 21 def func(self): #实例方法:将实例本身作为参数引入,仅实例可以调用,可以访问实例属性 22 self.publicCount = 999 23 print ‘func work‘ 24 25 def __secret_func(self): #私有方法 26 print "__secret_func work" 27 28 counter = JustCounter() 29 counter2= JustCounter() 30 print ‘-------对于类的公有属性赋值,所有实例共享此属性‘ 31 JustCounter.publicCount = 3 32 counter.count_public() 33 counter2.count_public() 34 print ‘-------不允许直接访问私有属性,只能通过给定的方法‘ 35 # counter.__secretCount 此句将报错 36 counter.count_secret() #通过给定方法访问 37 print ‘-------对于类的私有属性赋值,对实例无用‘ 38 JustCounter.__secretCount = 4 39 counter.count_secret() 40 counter2.count_secret() 41 print ‘-------类方法‘ 42 JustCounter.func_class() #或counter2.func_class() 43 counter.count_public() 44 counter2.count_public() 45 print ‘-------实例方法‘ 46 counter.func() 47 counter.count_public() 48 counter2.count_public() 49 print ‘-------静态方法‘ 50 counter.func_static() 51 JustCounter.func_static() 52 counter.func_static2(‘good‘,‘great‘) 53 print ‘-------由于上面‘实例方法’对实例公有属性赋值了一次,切断了此实例与类的联系‘ 54 JustCounter.publicCount = 3.5 55 counter.count_public() 56 counter2.count_public() 57 print ‘-------私有方法,仅仅只能在类的定义的内部作为一个中间函数给其他函数调用,不能在外部使用‘ 58 # counter.__secret_func() 此句将报错 59 print ‘-------使用特殊方法访问私有属性,访问私有方法‘ 60 counter._JustCounter__secret_func() 61 counter._JustCounter__secretCount = 1010 62 print counter._JustCounter__secretCount
输出结果为
-------对于类的公有属性赋值,所有实例共享此属性 3 3 -------不允许直接访问私有属性,只能通过给定的方法 0 -------对于类的私有属性赋值,对实例无用 0 0 -------类方法 func_class work 888 888 -------实例方法 func work 999 888 -------静态方法 func_static work func_static work args1= good args2= great -------由于上面‘实例方法’对实例公有属性赋值了一次,切断了此实例与类的联系 999 3.5 -------私有方法,仅仅只能在类的定义的内部作为一个中间函数给其他函数调用,不能在外部使用,以下将报错 -------使用特殊方法访问私有属性,访问私有方法 __secret_func work 1010 Process finished with exit code 0
1.公有属性
类公有属性的高明之处就在于,可以通过修改类公有属性a,修改所有实例中的这个公有属性a,做到全局控制,而如果需要实例单独控制自己的公有属性a,就创建实例同名属性a,切断被类属性a的控制。
2.私有
很多时候,为了数据相对安全或者某些方法安全,外部不可见,要将需要保护的属性或方法设置成私有属性或私有方法,并将它们嵌入到实例方法或类方法中,仅仅可以通过实例方法或类方法使用他们,保证必须按照我们给予的实例方法和类方法来使用,不允许非法操作。
3.注意事项
虽然私有属性和私有方法一定意义上是安全的,但这也只是相对安全,仍然有办法访问
java中有反射办法来访问和修改私有属性
python中可以使用 object._className__attrName 访问私有属性,用object._className__func()访问私有方法
因此,我们要理解,这里所谓的私有,是从一定程度上的安全,防止获取了对象的用户对用户进行误操作和保证封装性,防止其他程序员误操作等,而不是我们用来保证程序不被劫持数据的绝对安全,这个程度上,私有属性是必要而不可缺少的。