因为自己是做.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解释器使用改属性名称来阻止实例去访问那些属性。

Python中类的属性的访问控制的更多相关文章

  1. python中类中属性和方法的具体定义方法和使用

    1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...

  2. python中类的属性(class attribute)的解释

    python中的类叫 class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实 ...

  3. Python中的属性管理

    Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...

  4. Python class的属性访问控制和内建函数重写实现高级功能以及@property

    一.类属性的访问控制 Python Class确实是博大精深,我们还是来温习一下属性的访问控制作为开(fu)场(xi). 首先_varname是可以访问的,__varname是不能直接访问(原理是__ ...

  5. Python中类的方法属性与方法属性的动态绑定

    最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,发现廖雪峰老师的网站上面的学习资源很不错,而且言简意赅,提取了一些 ...

  6. Python: 浅淡Python中的属性(property)

    起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...

  7. Python 中的属性访问与描述符

    在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个name属性,那便可以使用foo.name对此属性进行访问.一般而言,点(. ...

  8. Python中的属性访问与描述符

    Python中的属性访问与描述符 请给作者点赞--> 原文链接 在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个nam ...

  9. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

随机推荐

  1. Ubuntu安装Apache+PHP

    1.Ubuntu 安装Apache 安装Apache sudo apt-get install apache2 修改端口号 打开 etc/apache2/port.config 修改 port 80 ...

  2. 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目

    第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目 创建一个MVC项目,是很容易的,大部分工作,VS都帮我们完成了.只需要按照如下步骤按部就班就可以了. 打开VS2017,选 ...

  3. java模板

    public class max { public static void main(String[]args){ """ /* xxx */ ""& ...

  4. java之JIT(Just in time)

    Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code).为了提高热点代码的执行效率,在运行时,虚拟机会把 ...

  5. 五,mysql优化——sql语句优化小技巧

    1,大批量插入数据 (1)对于MyISAM: alter table table_name disable keys; loading data; alter table table_name ena ...

  6. 三,memcached服务的两种访问方式

    memcached有两种访问方式,分别是使用telnet访问和使用php访问. 1,使用telnet访问memcacehd 在命令提示行输入, (1)连接memcached指令:telnet 127. ...

  7. ES六

    来自:http://es6.ruanyifeng.com/#docs/style 1,=> // bad console.log([1,2,3,4].map(function(x){return ...

  8. java获取当前文件路径的方法

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  9. 基于jeesite+android开发 电子商务系统免费教程

    下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...

  10. 【12】JMicro微服务-Zookeeper

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...