您的位置:首页 > 编程语言 > Python开发

Python 基础之面向对象

2017-11-16 13:27 218 查看
面向对象
多态
多态和方法

多态的多种形式

封装

继承

类和类型
类到底是什么

创建一个类

继承父类

多重继承

面向对象

多态:意味着可以对不同类的对象使用相同的操作。

封装:对外部世界隐藏对象的工作细节。

继承:以普通的类为基础建立专门的类对象。

多态

多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象(或者类)类型的不同而表现出不同的行为。

多态和方法

程序得到了一个对象,但是并不知道它是怎么实现的——它可能有多种“形状”。

绑定到对象特性上面的函数称为方法(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,方法判定顺序)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: