Python中类的属性的访问控制
因为自己是做.NET的,之前有学习过Python,喜欢这门语言的很多特性,最近又不时看了一会儿,将自己的感受分享给大家,其中也难免会用C#的角度看Python的语法,主要还是讲下Python中类中对属性的访问。
讲到属性访问,都能想到公有,私有,受保护,C#的方法是public private protected,Python中也真心让自己感觉到难以理解。
首先定义一个类(博客园对python代码没着色,大家看图吧)
就个人认识,不一定对,觉得Python是一门动态的语言,很多属性都是动态加上去,如name属性,当调用到这个setName方法时,Room类的实例才会拥有name属性,就像图中一样,如果在setName调用后,没有去调用setSize,而在display方法中又使用到了size属性,则程序报错,这里个人把这种属性当公开的吧,因为类的实例确实能访问到。
再来张图
如上图中的name和location属性,在构造函数__init__中传入,给这两个属性赋值,注意这个self,其实到现在我出说不清name和location是什么属性了,它们即可以是实例属性,也可以是类属性,使用变量nb和sz可以访问到,使用类名City也可以方法到,只不过用类名访问到的是空的字符串。如果改一些的话
在setRegion方法中,使用City.来找到region并给它赋值,那为什么使用nb和sz也能找到这个region,而且值是一样的呢,是不是有点像C#静态属性,是使用类名访问的,但在Python中又可以使用实例来访问,这是因为类和实例都有各自的一个作用域,当要在实例作用域上找一个属性时,如果找不到,则用向上去类作用域中找。自然,可以想象在City类中,name,location,region属于类作用域,但在实例作用域中出存在name和location属性。
可以简单地说,类作用域中的属性是所有实例都能访问到,而且修改后,其它实例也会影响,但究其原因是实例作用域找不到,找到了类作用域。
现在静态语言中的那一套真心不适用了,但引用作用域后,对Python的访问行为多少还是了解了点。
那来说说下私有呗
使用两个下划线来表示这是一个私有的属性,私有属性也涵盖类的私有属性和实例的私有属性,执行最后两个print语句时,程序报错。书中也讲到私有属性其实也是可以被访问到,Python解释器使用改属性名称来阻止实例去访问那些属性。