面向对象
- 多态:意味着可以对不同类的对象使用相同的操作。
- 封装:对外部世界隐藏对象的工作细节。
- 继承:以普通的类为基础建立专门的类对象。
多态
多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象(或者类)类型的不同而表现出不同的行为。
多态和方法
程序得到了一个对象,但是并不知道它是怎么实现的——它可能有多种“形状”。
绑定到对象特性上面的函数称为方法(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,方法判定顺序)。