Python中Class类用法实例分析


Posted in Python onNovember 12, 2015

本文实例讲述了Python中Class类用法。分享给大家供大家参考,具体如下:

尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦。因此我们关注Python在FP上的优势的同时,还得了解一下Python在OO方面的特性。

要讨论Python的OO特性,了解Python中的Class自然是首当其冲了。在Python中定义class和创建对象实例都很简单,具体代码如下:

class GrandPa:
  def __init__(self):
    print('I\'m GrandPa')
class Father(GrandPa):
  def __init__(self):
    print('I\'m Father!')
class Son(Father):
  """A simple example class"""
  i = 12345
  def __init__(self):
    print('这是构造函数,son')
  def sayHello(self):
    return 'hello world'
if __name__ == '__main__':
  son = Son()
  # 类型帮助信息 
  print('类型帮助信息: ',Son.__doc__)
  #类型名称
  print('类型名称:',Son.__name__)
  #类型所继承的基类
  print('类型所继承的基类:',Son.__bases__)
  #类型字典
  print('类型字典:',Son.__dict__)
  #类型所在模块
  print('类型所在模块:',Son.__module__)
  #实例类型
  print('实例类型:',Son().__class__)

运行效果如下:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
这是构造函数,son
类型帮助信息: A simple example class
类型名称: Son
类型所继承的基类: (<class '__main__.Father'>,)
类型字典: {'__module__': '__main__', 'sayHello': <function Son.sayHello at 0x010194F8>, '__doc__': 'A simple example class', '__init__': <function Son.__init__ at 0x010194B0>, 'i': 12345}
类型所在模块: __main__
这是构造函数,son
实例类型: <class '__main__.Son'>
>>>

Python支持多重继承

首先第一点,你会发现Class的定义中有一个括号,这是体现继承的地方。 Java用extends,C#、C++用冒号(:),Python则用括号了。从括号中包含着两个值,聪明的你一定可以发现:Python支持多重继承;

__init__是Class中的构造函数

第二点,__init__是Class中的构造函数,两种不同形式的构造函数体现了Python支持函数重载。在构造函数中,有一个特别的参数self,其含义与我们在Java和C#中常见的this是一样的。在这里需要强调一点:在Class中定义的方法实质上也是function,但是在方法定义的时候必须包含self这个参数,而且必须将self这个参数放在第一位;

python成员变量

第三点,在Python中,你并不需要显式的声明Class的Data Members,而是在赋值的时候,被赋值的变量就相应成为了Class的Data Memebers,正如代码中的x和y。不仅你不需要显式的声明Data Members,更加特别的,你甚至可以通过del方法将Class中的Data Memebers给删掉。当我第一次看到这样的特性的时候,着实吃了一惊。毕竟OO的第一条就是封装了,但是这样的特性是不是破坏了封装的特性呢?

python方法二义性问题

第四点,由于Python支持多重继承,因此就有可能出现方法二义性问题[1]。然而由于Python遵循深度优先的搜寻法则,很好地避免了方法二义性的问题。例如在以上的代码中,MyClass同时继承于BaseClassA和BaseClassB,假设MyClass调用一个叫derivedMethod方法,derivedMethod同时定义在BaseClassA和BaseClassB中,且Signature也完全相同,那么BaseClassA中的方法将被调用。如果BaseClassA中并没有定义derivedMethod,而是BaseClassA的父类定义了这个方法的话,将会是BaseClassA的父类中derivedMethod被调用。总之,继承方法搜索的路径是先从左到右,在选定了一个BaseClass之后,将会一直沿着该BaseClass的继承结构进行搜索,直至最顶端,然后再到另外一个一个BaseClass。

就先说着这么多了,对于Python中OO的特性将会在以后的Post中有进一步的讲述。

方法二义性:由于一个类同时继承于两个或者多个父类,而在这些父类当中存在着signature完全相同的方法,那么编译器将无法判断子类将继承哪个父类中的方法,从而导致方法二义性问题。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
Python加pyGame实现的简单拼图游戏实例
May 15 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
python f-string式格式化听语音流程讲解
Jun 18 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 Python
Python OpenCV实现图形检测示例详解
Apr 08 Python
python开发之函数定义实例分析
Nov 12 #Python
python开发之字符串string操作方法实例详解
Nov 12 #Python
深入浅析Python字符编码
Nov 12 #Python
python开发之for循环操作实例详解
Nov 12 #Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 #Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 #Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 #Python
You might like
聊天室php&amp;mysql(四)
2006/10/09 PHP
php ios推送(代码)
2013/07/01 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[01:09:24]Ti4开幕式
2014/07/19 DOTA
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python实现扫描ip地址的小程序
2019/04/16 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python 实现识别图片上的数字
2019/07/30 Python
python django中8000端口被占用的解决
2019/12/17 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
物业管理个人自我评价
2013/11/08 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
青年教师个人总结
2015/02/11 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs