目录
类
类(class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
为了代码的编写方便简洁,引入了类的定义;
一般,使用 class 语句来创建一个新类,class之后为类的名称(通常首字母大写)并以冒号结尾,例如:
class car(object):
def __init__(self,name): #构造函数
self.name=name
def sort(self):
print(self.name+"重量为1000KG")
def method(self):
print(self.name+"驾驶方式为自动驾驶")
#类中可以定义所使用的方法,类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self;
#__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
#self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数;
self代表类的实例,而非类
接下来是创建实例化对象,以及对象属性的访问;
import Car
thisCar=Car.car("小汽车") #实例化对象
thisCar.sort() #访问对象的属性
thisCar.method() #访问对象的属性
继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
什么是继承
继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
注意:python中的继承分为:单继承和多继承。
继承的目的就是提高代码的重用率减少了很多不必要的代码量,有下图就可以看出动物有,猫和狗的基本特性,动物就是父类,猫和狗就是子类。
继承的特点
1、在调用父类的方法时,需要加上父类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
2、在继承中父类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
3、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去父类中找)。
单继承
class bus(object): #创建bus类 def __init__(self, name): #构造函数 self.name = name def sort(self): #实现客车的重量属性 print(self.name+"重量为7T") #打印输出重量属性 def method(self): #实现客车的驾驶方法 print(self.name+"驾驶方式为手动驾驶") #打印输出驾驶方法 class bus1(bus): def __init__(self, name): self.name = nameimport Bus thisBus1=Bus.bus1("东风路28路公交车") #实例化对象 thisBus1.sort() #访问对象属性 thisBus1.method() #访问对象属性
输出结果:
多继承
class father(object): #创建father类 def __init__(self,money): #构造函数 self.money=money def play(self): #实现父亲play方法 print("play") def func(self): #实现父亲func方法 print("func1")class mother(object): #创建mother类 def __init__(self,faceValue): #构造函数 self.faceValue=faceValue def eat(self): #实现母亲eat方法 print("eat") def func(self): #实现母亲func方法 print("func2")#导入父类 from father import father from mother import mother class child(father,mother): #定义子类 def __init__(self,money,faceValue): #调用子类构造方法 self.money=money self.faceValue = faceValuefrom child import child #导入child包 def main(): c=child(300,100) # 实例化子类 print(c.money,c.faceValue) #打印子类属性 c.play() #调用父类father方法 c.eat() #调用父类mother方法 if __name__=="__main__": main()
输出结果:
300 100
play
eat
多态
作用
让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容(功能)的函数。
特点
只关心对象的实例方法是否同名,不关心对象所属的类型;对象所属的类之间,继承关系可有可无;多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;多态是调用方法的技巧,不会影响到类的内部设计。
例子1:
#定义Animal类
class Animal(object):
def __init__(self,name):
self.name = name
def eat(self): #实现动物吃的属性
print(self.name+"吃")#定义Cat类继承Animal类
class Cat(Animal):#定义子类
def __init__(self,name):
#self.name = name
super(Cat,self).__init__(name)
def eat(self):
print(self.name+"吃")
#定义Mouse类继承Animal类
class Mouse(Animal):#定义子类
def __init__(self,name):
#self.name = name
super(Mouse,self).__init__(name)
def eat(self):
print(self.name+"吃")#定义Person类,实现人可喂任意一种继承Animal类的动物类
class Person(object):
def feedAnimal(self,ani):
print("给你食物")
ani.eat()
#多态tom = Cat("tom")
jerry = Mouse("jerry")
per = Person()
per.feedAnimal(tom)
per.feedAnimal(jerry)
输出结果
例子2:
class bus2(object): #创建bus类 def __init__(self, name): #构造函数 self.name = name def method(self): #实现客车的驾驶方法 print(self.name+"驾驶方式为手动驾驶") #打印输出驾驶方法 #定义子类公交车bus3,父类为bus2 class bus3(bus2): def __init__(self, name): #构造函数 self.name=name #创建person对象 class person(object): def permethod(self,bus_name): bus_name.method() bus28 = bus3("28路公交车") #实例化对象 bus906 = bus3("906路公交车") #实例化对象 bus32 = bus3("B32路公交车") #实例化对象 per = person() per.permethod(bus28) #调用子类中重写的父类方法 per.permethod(bus906) #调用子类中重写的父类方法 per.permethod(bus32) #调用子类中重写的父类方法
结果: