Python 基础之面向对象
2017-11-16 13:27
218 查看
面向对象
多态
多态和方法
多态的多种形式
封装
继承
类和类型
类到底是什么
创建一个类
继承父类
多重继承
封装:对外部世界隐藏对象的工作细节。
继承:以普通的类为基础建立专门的类对象。
绑定到对象特性上面的函数称为方法(method)。
对于一个变量x来说,我们不需要知道他是字符串还是列表,就可以调用它的count方法——不用管它是什么类型(前提是你提供了一个字符作为参数)。
对于上述代码只需要知道x有个叫做count的方法,带有一个字符作为参数,并且返回整数值就够了。
例如:
很多函数和运算符都是多态的——至少你写的大部分程序可能都是,即使你不是有意这样。
封装并不等同于多态多态。多态可以让用户对于不知道是什么类的对象进行方法调用,而封装是不用关心对象是如何构建的而直接使用。
新的类可能保留了原本的类的大多数方法,可能只需要扩展几个新的方法。在编写新类的时候又不想把旧类的方法全部拷贝过去,那么这个时候就是继承出场的时候了。
例如:阿尔托利亚·潘德拉贡 属于“Servant”类的实例。但是“Servant”类是有很多子类诸如“Saber”、“Archer”、“Rider”等类的一般(抽象)类。并且吾王(阿尔托利亚·潘德拉贡)本身也属于“Saber”类。这个时候“Saber”类就是“Servant”类的子类。反过来说“Servant”类是“Saber”类的父类也称超类。
在面向对象的程序设计中,子类的关系是隐式的,一个类的定义取决它所支持的方法。所有类的实例都会包括这些方法。子类也会继承父类的方法。
self表示对自身对象的引用。在调用foo的setName方法时,foo自动的将自己作为第一参数传入函数中——因此形象的命名为self。
在使用多重继承时,有个需要注意的地方。如果一个方法从多个超类中继承(换句话说你有两个具有相同名字的不同方法),那么必须要注意一下超类的顺序:先继承的类中方法会重写后继承的类中的方法。
如果父类们共享一个父类,那么在查找给定方法或者特性的时访问的父类顺序称为MRO(Method Resolution Order,方法判定顺序)。
多态
多态和方法
多态的多种形式
封装
继承
类和类型
类到底是什么
创建一个类
继承父类
多重继承
面向对象
多态:意味着可以对不同类的对象使用相同的操作。封装:对外部世界隐藏对象的工作细节。
继承:以普通的类为基础建立专门的类对象。
多态
多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象(或者类)类型的不同而表现出不同的行为。多态和方法
程序得到了一个对象,但是并不知道它是怎么实现的——它可能有多种“形状”。绑定到对象特性上面的函数称为方法(method)。
对于一个变量x来说,我们不需要知道他是字符串还是列表,就可以调用它的count方法——不用管它是什么类型(前提是你提供了一个字符作为参数)。
from random import choice x=choice(['Hello,world!',[1,2,'e','e',3]]) #random 中的 choice函数,可以从序列中随机的选出元素给变量赋值 print(x.count('e'))
对于上述代码只需要知道x有个叫做count的方法,带有一个字符作为参数,并且返回整数值就够了。
多态的多种形式
任何不知道对象是什么类型,但是又必须为对象实现某种功能的时候,都会用到多态。例如:
def add(x,y): return x+y a=1 b=2 print(add(a,b)) a='Hello ' b='world!' print(add(a,b))
很多函数和运算符都是多态的——至少你写的大部分程序可能都是,即使你不是有意这样。
封装
封装是对全局作用域中其他区域隐藏多余信息的原则。听着有点像多态——适用对象而不知内部细节。两者概念类似,二者都会帮助处理程序组件而不用过多关注多余细节。封装并不等同于多态多态。多态可以让用户对于不知道是什么类的对象进行方法调用,而封装是不用关心对象是如何构建的而直接使用。
继承
继承是另外一种懒惰行为。作为一个苦逼的程序员自然不想把同一段代码写好几次。显然可以使用函数来解决。但是倘若现在已经有了一个类,而现在又想创建一个类似的新的类新的类可能保留了原本的类的大多数方法,可能只需要扩展几个新的方法。在编写新类的时候又不想把旧类的方法全部拷贝过去,那么这个时候就是继承出场的时候了。
类和类型
类到底是什么?
可以将类或多或少的视为种类或者类型的同义词。从很多方面来说,这就是类——一种对象。所有的对象都属于一个类,称为类的实例(instance)。例如:阿尔托利亚·潘德拉贡 属于“Servant”类的实例。但是“Servant”类是有很多子类诸如“Saber”、“Archer”、“Rider”等类的一般(抽象)类。并且吾王(阿尔托利亚·潘德拉贡)本身也属于“Saber”类。这个时候“Saber”类就是“Servant”类的子类。反过来说“Servant”类是“Saber”类的父类也称超类。
在面向对象的程序设计中,子类的关系是隐式的,一个类的定义取决它所支持的方法。所有类的实例都会包括这些方法。子类也会继承父类的方法。
创建一个类
class + 类名() + “:”class Person(object): def setName(self,name): self.name = name def getName(self): return self.name def greet(self): print("Hello world!I'm %s." % self.name) foo=Person() bar=Person() foo.setName("Asunna") bar.setName('Saber') foo.greet() bar.greet() #结果: # Hello world!I'm Asunna. # Hello world!I'm Saber.
self表示对自身对象的引用。在调用foo的setName方法时,foo自动的将自己作为第一参数传入函数中——因此形象的命名为self。
继承父类
将其他类名写在class语句后的圆括号内就表示可以继承父类class Filter(object): def init(self): self.blocked = [] def filter(self, sequence): return [x for x in sequence if x not in self.blocked] class SPAMFilter(Filter): def init(self): #重写父类中的init方法 self.blocked=["SPAM"] f=Filter() f.init() print(f.filter([1,2,3])) s=SPAMFilter() s.init() print(s.filter(["Spam","SPAM","SPAM",'spam',"ASPM"])) #result: # [1, 2, 3] # ['Spam', 'spam', 'ASPM']
多重继承
子类可以继承多个父类,方法如下:class Cal(object): pass class Tal(object): pass class TC(Cal,Tal): pass
在使用多重继承时,有个需要注意的地方。如果一个方法从多个超类中继承(换句话说你有两个具有相同名字的不同方法),那么必须要注意一下超类的顺序:先继承的类中方法会重写后继承的类中的方法。
如果父类们共享一个父类,那么在查找给定方法或者特性的时访问的父类顺序称为MRO(Method Resolution Order,方法判定顺序)。
相关文章推荐
- python基础—面向对象
- python基础之面向对象(二)
- python基础6:面向对象1
- python_fullstack基础(十四)-面向对象初识
- Python基础系列----函数,面向对象,异常
- 【Python基础】Python面向对象 - 2 - 类的高级主题
- 非程序员的编程之旅——Python基础篇(6)面向对象
- Python基础(面向对象之相关)
- Python基础09 面向对象的进一步拓展
- python基础之面向对象02
- python绘图基础—快速绘图和面向对象绘图
- Python基础—12-面向对象(02)
- python基础之面向对象01
- Python基础08 面向对象的基本概念
- Python基础—面向对象(进阶篇)
- Python基础09 面向对象的进一步拓展
- 【Python基础】07、Python类与面向对象
- 【Python基础】Python面向对象 - 3 - 新类,静态方法,类方法,实例方法
- Python基础—面向对象(初级篇)
- Python学习基础:面向对象(1)