类:属性方法的私有公有详解

 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()访问私有方法

  因此,我们要理解,这里所谓的私有,是从一定程度上的安全,防止获取了对象的用户对用户进行误操作和保证封装性,防止其他程序员误操作等,而不是我们用来保证程序不被劫持数据的绝对安全,这个程度上,私有属性是必要而不可缺少的。

原文地址:https://www.cnblogs.com/DylanHooz/p/8436629.html