python的面向对象的特性(继承、封装、多态)
创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象。以及面向对象的概念:继承、封装、多态。
多态: 可对不同类的对象使用同样的操作。
封装:对外部世界隐藏对象的工作细节。
继承:以普通的类为基础建立专门的类对象。
多态
面向对象程序设计最有趣的特性是多太,它是是让大多数人犯晕的特性。所以,先来介绍这个。
多态意思是“有多种形式”。多态意味着就算不知道变量所引用的对象类是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。
从最简单的开始
任何不知道对象到底是什么类型,但是又要对对象“做点什么”的时候,都会用到多态。这不仅限于方法----很多内建运算符和函数都有多态的性质,考虑下面这个例子:
- >>> 1 + 2
- 3
- >>> 'fish' + 'license'
- 'fishlicense'
复制代码
这里的加运算符对于数字(本例中为整数)和字符串(以及其他类型的序列)都能起作用。假设有个叫做add的函数,它可以将两个对象相加。那么可以直接将其定义成上面的形式,对于很多类型的参数都可以用,如下:
- >>> def add(x,y):
- return x+y
- >>> add(1,2)
- >>> add('hello.','world')
- 'hello.world'
复制代码
看起来有点傻,但是关键在于参数可以是任何支持加法的对象。
如果需要编写打印对象长度消息的函数,则只需对象具有长度(len函数可用)即可。
- >>> def length_message(x):
- print"The length of " , repr(x),"is",len(x)
- >>> length_message('chongshi')
- The length of 'chongshi' is 8
- >>> length_message([1,2,3])
- The length of [1, 2, 3] is 3
复制代码
len函数用于计算长度,repr用于放置函数的内容;repr函数是多态特性的代表之一---可以对任何东西使用。
很多函数和运算符都是多态的,你写的绝大多数程序可能都是,即便你并非有意这样。
封装
封装是对全局作用域中其它区域隐藏多余信息的原则。
封装听起来有些像多态,因为他们都是 抽象的原则---他们都会帮助处理程序组件而不用过多关心多余细节,就像函数做的一样。
但是封装并不等同于多态。多态的可以让用户对于不知道是什么类(或对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。
创建一个有对象(通过像调用函数一样调用类)后,将变量c绑定到该对象上。可以使用setName 和 getName 方法(假设已经有)
- >>> c = closedObject()
- >>> c.setName('sir lancelot')
- >>> c.getName()
- ‘sir lancelot’
复制代码
继承
我们不想把同一段代码写好几,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。
比如有动物类,我们又想在动物类的基础上建立鸟类、鱼类,哺乳动物类。
上面这些特性会根据后面的学习来深入的理解。
================================
创建自己的类
终于可以创建自己的类了,先来看一个简单的类:
- _metaclass_ = type #确定新式类
- class Person:
- def setName(self,name):
- self.name = name
- def getName(self):
- return self,name
- def greet(self):
- print "Hello, world! I'm %s" %self.name
复制代码
注意:新式类的语法中,需要在模块或者脚本开始的地方放置赋值语句_metaclass_ = type 。
创建了一个Person的类,这个类包含了三个方法定义,只是那个self看起有点奇怪,它是对于对象自身的引用。
让我们创建实例看看:
- >>> huhu = Person()
- >>> huhu.setName('hu zhiheng')
- >>> huhu.greet()
- Hello, world! I'm hu zhiheng
复制代码
应该能说明self的用处了,在调用huhu的setName 和 greet 函数时,huhu自动将自己作为第一个参数传入函数中----因此形象地命名为self。每个人可能都会有自己的叫法,但是因为它总是对象自身,所以习惯上总是叫做self 。
和之前一样,特性也可以在外部访问:
- >>> huhu.name
- 'hu zhiheng'
- >>> huhu.name = 'yoda'
- >>> huhu.greet()
- Hello, world! I'm yoda
复制代码
特性、函数和方法
self 参数事实上正是方法和函数的区别。方法将它们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供。所以可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了:
- >>> class Class:
- def method(self):
- print 'I have a self!'
- >>> def function():
- print "I don't"
- >>> instance = Class()
- >>> instance.method()
- I have a self!
- >>> instance.method = function
- >>> instance.method()
- I don't
复制代码
self参数并不取决于调用方法的方式,目前使用的是实例调用方法,可以随意使用引用同一个方法的其他变量:
- >>> class Bird:
- song = 'Squaawk!'
- def sing(self):
- print self.song
- >>> bird = Bird()
- >>> bird.sing()
- Squaawk!
- >>> birdsong = bird.sing
- >>> birdsong()
- Squaawk!
复制代码
指定超类
子类可以扩展超类的定义。将其他类名写在class语句后的圆括号内可以指定超类:
- class Filter:
- def init(self):
- self.blocked = []
- def filter(self , sequence):
- return [x for x in sequence if x not in self.blocked]
- class SPAMFilter(Filter): #SPAMFilter是Filter的子类
- def init(self): #重写Filter类中的init方法
- self.blocked = ['SPAM']
复制代码
Filter 是个用于过滤序列的通用类,事实上它不能过滤任何东西:
- >>> f = Filter()
- >>> f.init()
- >>> f.filter([1,2,3])
- [1, 2, 3]
复制代码
Filter 类的用户在于它可以用作其他类的基类(超类,“java中叫父类”),比如SPAMFilter类,可以将序列中的“SPAM”过滤出来。
- >>> s = SPAMFilter()
- >>> s.init()
- >>> s.filter(['SPAM','SPAMD','SPAM','HELLO','WORLD','SPAM'])
- ['SPAMD', 'HELLO', 'WORLD']
复制代码
调查继承
如果想要查看一个类是否是另一个的子类。可以使用内建的issubclass函数:
- >>> issubclass(SPAMFilter, Filter)
- True
- >>> issubclass(Filter,SPAMFilter)
- False
python的面向对象的特性(继承、封装、多态)的更多相关文章
- OOP面向对象 三大特征 继承封装多态
OOP面向对象 ----三大特征 继承封装多态 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构 ...
- Python入门-面向对象三大特性-继承
面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容. 例如: 猫可以:喵喵叫.吃.喝.拉.撒 狗可以:汪汪叫.吃.喝.拉.撒 如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实 ...
- python之面向对象三大特性: 继承(单继承)
什么是继承 专业角度: B 继承 A类, B就叫做A的子类,派生类, A叫做B的父类,基类,超类. B类以及B类的对象使用A类的所有的属性以及方法. 字面意思: 继承就是继承父母所有的资产 class ...
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- 黑马程序猿——JAVA面向对象的特性:封装,继承,多态
- ----------android培训.java培训.java学习型技术博客.期待与您交流!------------ ...
- Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。
Python3 与 C# 面向对象之-继承与多态 文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...
- Java基础-面向对象第一特性之封装(Encapsulation)
Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- C#基础总结之八面向对象知识点总结-继承与多态-接口
.方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...
- JAVA基础——面向对象三大特性:封装、继承、多态
JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...
随机推荐
- 《Spring实战》-1
1.Spring的主要特性:依赖注入DI和面向切面编程AOP. 2.关键策略: 轻量级和最小侵入性编程:POJO 松耦合:DI和AOP 声明式编程:切面和惯例 减少样板式代码:切面和模板 3.Spri ...
- MVVM模式WPF的ComboBox数据绑定,使用Dictionary作为数据源
ViewModel//属性定义 Dictionary<int, string> _selGroupList; /// <summary> /// 分组下拉列表 /// < ...
- UGUI 深度優化提升手遊效能
https://hackmd.io/s/S1z1ByaGb#UGUI-%E6%B7%B1%E5%BA%A6%E5%84%AA%E5%8C%96%E6%8F%90%E5%8D%87%E6%89%8B%E ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
- C#中==与equal的区别
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地 ...
- Golang 连接 MongoDB使用连接池
可以免费试用 MongoDB ,500MB 平时做测试没有问题啦,连接数据库可能因为网络有点慢,但是我们是测试啊,不在乎这点吧~ 这是怎么申请试用版的博客,感谢这位大佬.注册好用起来很方便~ 传送门 ...
- 2019.2.25考试T3, 离线+线段树
\(\color{#0066ff}{题解}\) #include<bits/stdc++.h> #define LL long long LL in() { char ch; LL x = ...
- 牛客国庆集训day5 B 电音之王 (大数乘模)
链接:https://www.nowcoder.com/acm/contest/205/B来源:牛客网 题目描述 终于活成了自己讨厌的样子. 听说多听电音能加快程序运行的速度. 定义一个数列,告诉你a ...
- matplotlib学习笔记(四)
利用matplotlib可以显示图像 imread()和imshow()提供了简单的图像载入和显示功能. img = plt.imread("xxx.jpg") imread()可 ...
- Luogu P4404 [JSOI2010]缓存交换 优先队列
细节题?...调了半天.... 可以发现,每一次从缓存中删除的主存一定是下次访问最晚的,可以用优先队列来处理...还有要离散化...还有链表末尾要多建一些点...否则会死的很惨... #include ...