python3 入门 (四) 类与继承
Python 类
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。
在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。
类定义
类定义语法格式如下:
class ClassName:<statement-1>...<statement-N>
类对象:创建一个类之后,可以通过类名访问、改变其属性、方法
实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。
类的属性
可以使用点(.)来访问对象的属性
也可以使用以下函数的方式来访问属性:
getattr(obj, name[, default]) : 访问对象的属性
hasattr(obj,name) : 检查是否存在一个属性
- setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
- delattr(obj, name) : 删除属性
Python内置类属性
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)
1 class Person: 2 "Person类" 3 def __init__(self, name, age, gender): 4 print('进入Person的初始化') 5 self.name = name 6 self.age = age 7 self.gender = gender 8 print('离开Person的初始化') 9 10 def getName(self): 11 print(self.name) 12 13 p = Person('ice', 18, '男') 14 15 print(p.name) # ice 16 print(p.age) # 18 17 print(p.gender) # 男 18 print(hasattr(p, 'weight')) # False 19 # 为p添加weight属性 20 p.weight = '70kg' 21 print(hasattr(p, 'weight')) # True 22 print(getattr(p, 'name')) # ice 23 24 print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'} 25 print(Person.__name__) # Person 26 print(Person.__doc__) # Person类 27 print(Person.__dict__) # {'__doc__': 'Person类', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'} 28 print(Person.__mro__) # (<class '__main__.Person'>, <class 'object'>) 29 print(Person.__bases__) # (<class 'object'>,) 30 print(Person.__module__) # __main__
类的方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。
类的专有方法:
__init__ 构造函数,在生成对象时调用
__del__ 析构函数,释放对象时使用
__repr__ 打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__div__除运算
__mod__求余运算
__pow__称方
__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++中构造函数类似。只需在自定义的类中重写__init__()方法即可。
1 class Person: 2 def __init__(self, name, age, gender): 3 print('进入Person的初始化') 4 self.name = name 5 self.age = age 6 self.gender = gender 7 print('离开Person的初始化') 8 9 def getName(self): 10 print(self.name) 11 12 # Person实例对象 13 p = Person('ice', 18, '男') 14 print(p.name) 15 print(p.age) 16 print(p.gender) 17 p.getName() 18 19 # 进入Person的初始化 20 # 离开Person的初始化 21 # ice 22 # 18 23 # 男 24 # ice
析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:
类的封装
python通过变量名命名来区分属性和方法的访问权限,默认权限相当于c++和java中的public
类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
虽然python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性。其实python内部私有化的实现只是将attrName属性变为了_className__attrName而已
1 class Demo: 2 __id = 123456 3 4 def getId(self): 5 return self.__id 6 7 temp = Demo() 8 # print(temp.__id) # 报错 AttributeError: 'Demo' object has no attribute '__id' 9 print(temp.getId()) # 123456 10 print(temp._Demo__id) # 123456
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
- 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。使用super().__init__()或parentClassName.__init__()
- 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
- 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
多态
如果父类方法的功能不能满足需求,可以在子类重写父类的方法。实例对象调用方法时会调用其对应子类的重写后的方法
转载于:https://www.cnblogs.com/z941030/p/4851650.html
python3 入门 (四) 类与继承相关推荐
- ExtJS入门之一 类与继承
在项目中使用ExtJS已经有一段时间了, 对于这个庞大的Script类库有了一定的了解, 在Ext的使用上也有了一定的经验, 现将这些经验做一下总结, 作为一个入门材料给大家分享. 对于Ext库, 不 ...
- python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher:lesson = "python"def __init__(self, ...
- Nhibernate+SQLite 入门实例指南二 类的继承、多态关系
昨天忘记向源代码下载了,现在补上第一章的代码:http://files.cnblogs.com/9527/QuickStart1.rar 实例二.类的继承.多态关系 在我们实际设计过程中,经常碰到类的 ...
- python3类的继承详解_基于python3 类的属性、方法、封装、继承详解
下面小编就为大家带来一篇基于python3 类的属性.方法.封装.继承实例讲解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 Python 类 Python中的类提供了 ...
- python3类的继承详解_python3 多重继承机制
由于python中包含多重继承机制,那么子类在多重继承中,到底用的是哪一个超类的方法就是大家关心的问题,之前在查阅已有书籍无果后,只得去翻官方文档与博客,终于得解,于是在此总结归纳. 全称 方法解析顺 ...
- python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承
注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...
- Visual C++ 2008入门经典 第九章类的继承和虚函数(二)
//9.6.7 虚析构函数 /*#include "stdafx.h" #include <iostream> using namespace std; using n ...
- 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用
实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...
- 实验四:继承性和派生类 建一个楼房Building为基类,建立住宅类House继承Building,存储房号和面积,建立办公室类Office继承Building,存储办公室名称和电话
/* * 实验四:继承性和派生类 * 内容提要:建立一个楼房基类Building为基类,用于存储地址和楼号 * 建立住宅类House继承Building, 用来存储房号和面积, * 另外建立办公室类O ...
最新文章
- fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭...
- 皮一皮:从地理位置分析当年的那件事...
- hdu 1598(最小生成树变形)
- CentOS生成自签名证书配置Apache https
- pytorch实现图像分类代码实例
- ntfs分配单元大小_万字长文图解 Go 内存管理分析:工具、分配和回收原理
- 独家总结 | 决策树算法Python实现(附代码详解及注释)
- android获取服务器时间格式,Android 获取服务器与客户端时差的实例代码
- java linux at_linux下运行java程序报错,求大神解答
- android沉浸式状态栏封装—教你玩出新花样
- 基于JSP的学生管理系统
- C# --- WinForm基本知识与绘图(上)
- 计算机视觉-1.2手写字体识别
- 终于把Edison板子上线了
- 对图像高通滤波matlab,高通巴特沃斯滤波器在MATLAB中对图像进行滤波
- WiFi万能钥匙+小米手机拿到coffee店WiFi密码
- 分享一本好书《极简主义》-----书中的价值观绝对能引领我们
- 全新版的TFN 光时域反射仪上线了,大家一块了解一下吧。
- 最新天气预报接口【2015-05-14改】
- python语言由psf组织所有、这是一个商业组织_智慧树知道营销管理章节测验答案...
热门文章
- What is Gensim?
- Angualr6表单提交验证并跳转
- java/android 做题中整理的碎片小贴士(5)
- 18.11 LVS DR模式搭建 18.12 keepalived + LVS
- IOS-资源最小化之点九图片的使用
- NS2源码图示---数据链路层 (转帖)
- APL开发日志--2012-11-08
- .bashrc: line 123: syntax error: unexpected end of file
- bmp类型转成Halcon的Hobject类型
- 深圳睿思特舒适旅游运营管理_毛大庆新年祭出flag2020年管理面积超越WeWork,联办行业2019逆势换挡不减速 | 新办公...