python 类访问控制

在python类中,有属性和方法,外部代码能够直接经过实例来访问修改.python

若是让内部的属性不被外部访问到,在属性变量前面加上__2个下划线,在python中,实例的变量名若是是由__2个下花钱开头的,就表明这是一个私有变量.只有内部能够访问,外部不准直接经过类或者实例访问.
代码:
1 class F:
2     __name = "xurui"
3 f = F()
4 f.__name
5 F.__name ##报错,AttributeError: type object 'F' has no attribute '__name'
虽说外部访问不了一个内部私有属性,可是能够经过类中方法间接的访问到,修改
类内部方法getname和setname
 1 class F:
 2     __name = "xurui"             
 3     def getName(self):
 4         return self.__name,self
 5     def setName(self,name):
 6         self.__name = name
 7         return self.__name,self
 8 f = F()      #类中self,都是f这实例对象.
 9 res = f.getName()
10 print(res,f)
11 result = f.setName("zhangsan")
12 print(result,f)
13 结果:
14 ('xurui', <__main__.F object at 0x0000000000BAA048>) <__main__.F object at 0x0000000000BAA048>
15 ('zhangsan', <__main__.F object at 0x0000000000BAA048>) <__main__.F object at 0x0000000000BAA048>

双下划线开头的私有属性,是否是必定不能从外部访问呢?其实不是的编程

1 class F:
2     __name = "xurui"
3 f = F()
4 result = f._F__name          ##经过这个方式能够从外部访问...
5 print(result) 
python中2个有趣的现象,外部变量遮蔽类中的变量..(来自核心编程)
从实例中访问类属性必需要谨慎.和一般python变量同样,任何对实例属性的赋值都会建立一个实例属性(若是实例属性不存在的话),而且对其赋值.可是,若是类属性中存在同名的属性,就是产生前面所说的有趣的反作用.python3.x依旧存在.
下面上代码:
 1 class Foo:
 2     x = 10
 3 f = Foo()
 4 print("原始数据 经过实例访问:{},经过类访问:{}".format(f.x,Foo.x))
 5 # print(f.x += 10)
 6 f.x =f.x+10
 7 print("f.x增长10后 经过实例访问:{},经过类访问:{}".format(f.x,Foo.x))
 8 del f.x
 9 print("del干掉f.x后 经过实例访问:{},经过类访问:{}".format(f.x,Foo.x))
10 ## 说明,代码建立了一个f.x新的实例属性,它覆盖了对类属性的引用.然而,类属性自己没有受到影响,仍然存在类域中,还能够经过类属性来访问到.给一个与类属性同名的实例属性赋值,咱们会有效的遮蔽类属性,一旦咱们删除了这个实例属性,类属性又重现天日.
11 结果:
12 原始数据 经过实例访问:10,经过类访问:10
13 f.x增长10后 经过实例访问:20,经过类访问:10
14 del干掉f.x后 经过实例访问:10,经过类访问:10
 1 class Foo:
 2     x = {"k1" : 10}
 3 f = Foo()
 4 print("原始数据 经过实例访问:{},经过类访问:{}".format(f.x,Foo.x))
 5 f.x["k1"] = 20
 6 print("f.x值变20后 经过实例访问:{},经过类访问:{}".format(f.x,Foo.x))
 7 del f.x
 8 print("del干掉f.x后 经过实例访问:{},经过类访问:{}".format(f.x,Foo.x))
 9 结果:
10 Traceback (most recent call last):
11   File "C:/Users/xurui/PycharmProjects/q1/2017-02-21/lei/lei.py", line 10, in <module>
12     del f.x
13 AttributeError: x
14 原始数据 经过实例访问:{'k1': 10},经过类访问:{'k1': 10}
15 f.x值变20后 经过实例访问:{'k1': 20},经过类访问:{'k1': 20}
为何下面的dict类型的就会del报错呢??
缘由在于:
python是由c写成的cpython.
c语言中,并无字符串这个概念,c中叫作字符数组,存储在内存中,是一块连续的空间,不可修改,任何修改字符数组的行为,都会在不影响原始的字符数组下,建立产生一个新的字符数组..
而dict就不同了,它在内存中存储,是一系列非连续的内存空间,能够在原来的基础上修改,因此,第二个例子中del f.x就会报错.
相关文章
相关标签/搜索