目录
一、封装
二、类的继承
三、多态性
python编程的重点是面向对象编程,而面向对象编程的核心方法就是封装、继承和多态。
一、封装
先简单介绍下封装,个人理解说就是把数据和方法封起来,然后装到一个类里,使用者不关注里面的实现逻辑,只需要传符合规定的参数,调用对应的方法,就能得到结果,类就是多个相关功能函数的封装。
写个简单的例子:
class Jisuan(): #定义一个计算的类
def __init__(self,x,y): #设置属性x,y
self.x = x #定义属性x
self.y = y #定义属性y
def add2(self): #定义一个相加方法
print(self.x+self.y) #打印x和y相加的结果
def subtract2(self): #定义一个相乘的方法
print(self.x*self.y) #打印相乘的结果
Atom =Jisuan(1,2) #创建实例 Atom
Atom.add2() #调用相加的方法 打印结果为:3
Atom.subtract2() #调用相乘的方法 打印结果为:2
上面例子就可以理解成是一个封装,我不用关内部是怎么设计的,我只要传入两个数,如果我想让他们相加就调相加的方法,如果想让他们相乘就调相乘的方法
二、类的继承
1、继承父类
类的继承从字面意思就可以看出来功能,就是继承。举个现实生活的例子,父亲有一辆车、有一套房子、有100W,这些东西作为儿子也可以继承过来用,在我们定义儿子那个类的时候,就可以直接把父亲的这些继承过来。
看个例子:
class Father(): #定义一个Father的类
def car(self): #定义一个car的方法
print("我有一辆车") #打印 我有一辆车
def house(self): #定义一个housr的方法
print("我有一套房子") #打印 我有一套房
def money(self): #定义money的方法
print("我有100万") #打印 我有100万
class Son(Father): #定义一个儿子的类,然后继承Father这个类的东西
def marry(self): #定义一个方法 我结婚了
print("有媳妇了") #打印 有媳妇了
son1 = Son() #创建实例son1
son1.money() #调用money的方法 打印结果为:我有100万
son1.marry() #调用marry的方法 打印结果为:有媳妇了
上面的例子可以看出来,Son的这个类下没有money这个方法,但是因为是继承了Father类,所以就可以直接使用Father类下的函数。
2、方法的复写
父亲打算捐款20W,只给自己的儿子留80W,所以就是爸爸有100W,但是儿子只有80W,这时候方法应该怎么调用呢?
这样的话就可以复写一个新的方法了,复写的方法使父类的方法和子类的方法名相同,然后在子类调用该方法时,就不会调用父类的方法,而是调用的就是子类新写的这个方法。
class Father(): #定义一个Father的类
def car(self): #定义一个car的方法
print("我有一辆车") #打印 我有一辆车
def house(self): #定义一个housr的方法
print("我有一套房子") #打印 我有一套房
def money(self): #定义money的方法
print("我有100万") #打印 我有100万
class Son(Father): #定义一个儿子的类,然后继承Father这个类的东西
def marry(self): #定义一个方法 marry
print("有媳妇了") #打印 有媳妇了
def money(self): #定义一个方法 money
print("我只有80万了") #打印 我只有80万了
son1 = Son() #创建实例son1
father1 = Father() #创建实例father1
son1.money() #son1调用money的方法 打印结果为:我只有80万了
father1.money() #father1调用money的方法 打印结果为:我有100W
如这个例子,本来Son调用money这个方法时,应该是调继承过来的父类的money方法,但是需求要求我们Son的money就是自己的money,不能使用父类的,所以在Son的类里又新写了一个money的方法,这样Son在调用money的方法时,就会调用Son类里的money方法,但是Father调用money方法时,还是调用的自己的函数里的money。
3、继承多个类
一个子类也可以继承多个父类,只需要在子类后面的()中,加上需要继承的父类就行,中间用逗号 , 隔开。
class Father(): #定义一个Father的类
def car(self): #定义一个car的方法
print("我有一辆车") #打印 我有一辆车
def house(self): #定义一个housr的方法
print("我有一套房子") #打印 我有一套房
def money(self): #定义money的方法
print("我有100万") #打印 我有100万
class Mother(): #定义一个Mother的类
def house(self): #定义一个house的方法
print("我有一个大别墅") #打印 我有一个大别墅
def company(self): #定义一个company的方法
print("我有一个公司") #打印 我有一个公司
class Son(Mother,Father): #定义一个儿子的类,然后继承Mother,Father这两个类的东西
def marry(self): #定义一个方法 我结婚了
print("有媳妇了") #打印 有媳妇了
def money(self): #定义一个方法 Money
print("我只有80万了") #打印 我只有80万了
son1 = Son() #创建实例son1
son1.house() #调用house的方法 打印结果为:我有一个别墅
son1.company() #调用父类的company方法 打印结果为:我有一个公司
就像这个例子,我有新建了一个Mother的父类,然后继承给了Son,这时候Son就可以用Mother里的方法了,但是如果继承的两个父类里有同一个方法时,在子类继承时,()里那个父类在前面,就会调用谁的方法,比如上面调用的house方法,Father的是一套房子,Mother的是一个大别墅,但是因为继承时,Mother写在了前面,所以Son在调用时,就调用的Mother的house方法。
三、多态性
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数,可以简单理解为在不同的类里同一个名称的函数实现了不同的方法,上面方法复写也属于函数多态性的一种,money方法在不同的实例里实现了不同的功能,可以看个简单的例子。
class Animal(): #定义一个Animal类
def talk(self): #定义一个talk的方法
print("会叫") #打印 会叫
class Dog(Animal): #定义一个 Dog类
def talk(self): #定义一个talk的方法
print("会 汪汪汪 叫") #打印 会 汪汪汪 叫
class Cat(Animal): #定义一个Cat的类
def talk(self): #定义一个talk的方法
print("会 喵喵喵 叫") #打印 会 喵喵喵 叫
animal = Animal() #实例化类Animal
animal.talk() #调用talk方法 打印结果为:会叫
dog = Dog() #实例化类Dog
dog.talk() #调用talk方法 打印结果为:会 汪汪汪 叫
cat = Cat() #实例化类Cat
cat.talk() #调用talk方法 打印结果为:会 喵喵喵 叫
比如这个例子中,在调用Dog和Cat类的talk方法时,Dog和Cat类都有本身的talk方法和继承过来的Animal的talk方法,在调用时,优先查找本身的talk方法,如果没有的话再去调父类的talk方法,这个就可以称之为多态。