原标题:Python类与方法的私有化

1. 创建自己的类

学习面向对象的第一步,就是创建一个类。因为类是面向对象的基石。Python类和其他编程语言(Java、C#等)的类差不多,也需要使用class关键字。下面通过一个实际的例子来看一下Python类是如何创建的。

本例会创建一个类,以及利用这个类创建两个对象,并调用其中的方法。

程序运行结果如下图所示。

从上面的代码我们可以了解到Python类的如下知识点。

Python类使用class关键字定义,类名直接跟在class关键字的后面。

类也是一个代码块,所以类名后面要跟着一个冒号(:)。

类中的方法其实就是函数,定义的方法也完全一样,只是由于函数定义在类的内部,所以为了区分,将定义在类内部的函数称为方法。

我们可以看到,每一个方法的第1个参数都是self,其实这是必须的。这个参数名不一定叫self(可以叫abc或任何其他名字),但任意一个方法必须至少指定一个self参数,如果方法中包含多个参数,第1个参数将作为self参数使用。在调用方法时,这个参数的值不需要自己传递,系统会将方法所属的对象传入这个参数。在方法内部可以利用这个参数调用对象本身的资源,如属性、方法等。

通过self参数添加的name变量是Person类的属性,可以在外部访问。本例设置了person2对象的name属性的值,与调用person2.setName方法的效果完全相同。

使用类创建对象的方式与调用函数的方式相同。在Python语言中,不需要像Java一样使用new关键字创建对象,只需要用类名加上构造方法(在后面的章节会详细介绍)参数值即可。

调用对象的方法有两种方式,一种是直接通过对象变量调用方法,另一种是通过类调用方法,并且将相应的对象传入方法的第1个参数。在本例中使用了Person.greet(person2)的方式调用了person2对象中的greet方法。

如果使用集成开发环境,如PyDev、PyCharm,那么代码编辑器也会对面向对象有很好的支持,例如,当在对象变量后输入一个点(.)后,IDE会为我们列出该对象中所有可以调用的资源,包括方法和属性,如下图所示。

2.方法和私有化

Python类默认情况下,所有的方法都可以被外部访问。不过像很多其他编程语言,如Java、C#等,都提供了private关键字将方法私有化,也就是说只有类的内部方法才能访问私有化的方法,通过正常的方式是无法访问对象的私有化方法的(除非使用反射技术,这就另当别论了)。不过在Python类中并没有提供private或类似的关键字将方法私有化,但可以曲线救国。

在Python类的方法名前面加双下划线(__)可以让该方法在外部不可访问。

如果执行上面的代码,会抛出如下图所示的异常信息,原因是调用了私有化方法method2。

其实“method2”方法也不是绝对不可访问。Python编译器在编译Python源代码时并没有将“method2”方法真正私有化,而是一旦遇到方法名以双下划线(__)开头的方法,就会将方法名改成“ClassNamemethodName”的形式。其中ClassName表示该方法所在的类名,“methodName”表示方法名。ClassName前面要加上但单下划线()前缀。

对于上面的代码,Python编译器会将“method2”方法更名为“_Personmethod2”,所以在类的外部调用“method2”方法会抛出异常。抛出异常的原因并不是“method2”方法被私有化了,而是Python编译器把“method2”的名称改为“_Personmethod2”了。当我们了解了这些背后的原理,就可以通过调用“_Personmethod2”方法来执行“method2”方法。

本例会创建一个MyClass类,并定义两个公共的方法(getName和setName)和一个私有的方法(outName)。然后创建了MyClass类的实例,并调用了这些方法。为了证明Python编译器在编译MyClass类时做了手脚,本例还使用了inspect模块中的getmembers函数获取MyClass类中所有的成员方法,并输出方法名。很显然,“outName”被改成了“_MyClass__outName”。

程序运行结果如下图所示。

从getmembers函数列出的MyClass类方法的名字可以看出,“_MyClassoutName”被绑定到了“outName”方法上,我们可以将“_MyClassoutName”看做是“outName”的一个别名,一旦为某个方法起了别名,那么原来的名字在类外部就不可用了。MyClass类中的getName方法和setName方法的别名和原始方法名相同,所以在外部可以直接调用getName和setName方法。返回搜狐,查看更多

责任编辑:

python创建person类_Python类与方法的私有化相关推荐

  1. python创建新进程_Python os.fork()方法:创建新进程

    玩转TensorFlow分布式(多GPU和多服务器)详解 本节介绍有关TensorFlow分布式的两个实际用例,分别是数据并行(将数据分布到多个GPU上)和多服务器分配. 玩转分布式TensorFlo ...

  2. python中类的定义_python 类中定义类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 现有自定义类(color.py)如下,类位于路径'userschuxingpyt ...

  3. python定义方法继承类_Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...

  4. python定义一个人类_Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...

  5. python 类方法装饰器_python类装饰器即__call__方法

    上一篇中我对学习过程中的装饰器进行了总结和整理,这一节简单整理下类装饰器 1.类中的__call__方法: 我们在定义好一个类后,实例化出一个对象,如果对这个对象以直接在后边加括号的方式进行调用,程序 ...

  6. python类_python类和对象

    1.self? python的self相当于c++的指针 self相当于每个房子的门派号,同一个类生成很多对象,对象很相似.当一个对象的方法被调用时,对象为第一个参数传递给方法. 2.python的魔 ...

  7. python中类的嵌套_python类的嵌套

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在.net和java语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的 ...

  8. 用python定义一个员工类_python类的定义和使用

    类的定义: 类是用来描述具有相同的属性和方法的对象的集合.它定义了该集合中的每个对象所共有的属性和方法.对象时类的实例. 二.Python创建类: 使用class语句来创建一个新类,class之后为类 ...

  9. python创建实例会调用哪些魔术方法_Python最会变魔术的魔术方法,我觉得是它!...

    作者:豌豆花下猫 来源:Python猫 在,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系. 但是,文中也提到了 ...

  10. python中的数据成员有两类_Python类和对象

    一.概念 1.面向对象(Object Oriented,即OO),是一种设计思想. 2.面向对象编程(Object Oriented Programming,即OOP),可以使软件设计更加灵活,并且能 ...

最新文章

  1. 我为什么强烈反对程序员加班?
  2. 使用函数实现数据大小端转换
  3. 论文浅尝 | Complex Embeddings for Simple Link Prediction
  4. IDEA图形化操作git
  5. 深入理解Java中的volatile关键字
  6. MongoDB 和 mySql 的关系
  7. EndnoteX9下载并安装
  8. 深度卷积神经网络(CNN)
  9. 微信小程序 添加分割线
  10. 2003服务器系统密匙,windows server 2003 安装密钥
  11. 梯形图c语言转换软件,梯形图转化为HEX软件
  12. Python生成requirement.txt文件
  13. Seeker的奇妙求职历险(华为笔试)
  14. POI Excel实现内容替换
  15. P4086 [USACO17DEC]My Cow Ate My Homework S(静态数据预处理:后缀和、后缀最小值)
  16. mysql乘法_mysql乘法
  17. 2020年美容师(中级)报名考试及美容师(中级)考试总结
  18. 惯导系列(二):滤波相关的算法
  19. SpringBoot集成elasticsearch使用
  20. 手机被偷后,让小偷欲哭无泪的高招

热门文章

  1. LED背光源具的优势
  2. 随机优化算法–爬山法VS模拟退火算法
  3. GBA开发入门(转收藏)
  4. 电力监控服务器维修,地铁电力监控系统(PSCADA)发生故障应该如何处理
  5. leetcode 没有php,Leetcode PHP题解--D99 860. Lemonade Change
  6. 杭电acm--2154跳舞毯
  7. matlab 画三维图像
  8. PPT技巧:快速实现照片双重曝光效果
  9. php越权执行命令漏洞_泛微OA系统多版本存在命令执行漏洞
  10. 网关的作用(两个内网主机通信原理)