面向对象思维
面向对象编程:
简称:OOP,是一种编程的思想。OOP把对象当成一个程序的基本单元,一个对象包含了数据和操作数据的函数。面向对象的出现极大的提高了编程的效率,使其编程的重用性增高。
面向过程强调的是自己,凡是亲历亲为。面向对象强调的是对象。
我们拿一个例子来说明:把大象装进冰箱需要几步?
看起来好像面向过程更加简单,确实在一些简单的逻辑上,确实是面向过程更加简单一点,但是当你面对是一系列复杂的模块和功能或者在逻辑发生更改的时候。各司其职的面向对象思想变会将很多复杂的逻辑简单化。
比如我们更换一下需求:把大象装进笼子需要几步?
面向过程:我们需要把之前装冰箱的方法重写一遍。
面向对象:我们只需要创建一个笼子对象,让其继承冰箱,笼子就也有了冰箱开门关门的属性。
Python面向对象的重要术语:
1、多态(polymorphism) 一个函数有多种表现形式,调用一个方法有多种形式,但是表现出的方法是不一样的。
2、继承(inheritance)子项继承父项的某些功能,在程序中表现某种联系
3、封装(encapsulation)把需要重用的函数或者功能封装,方便其他程序直接调用
4、类 对具有相同数据或者方法的一组对象的集合
5、对象 对象是一个类的具体事例
6、实例化 是一个对象事例话的实现
7、标识 每个对象的事例都需要一个可以唯一标识这个事例的标记
8、实例属性 一个对象就是一组属性的集合
9、事例方法 所有存取或者更新对象某个实例一条或者多条属性函数的集合。
10、类属 属于一个类中所有对象的属性,
11、类方法 那些无须特定的对性实例就能够工作的从属于类的函数。
类、继承
创建类
创建一个vehicle类
class vehicle(object):
#self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
#构造函数 __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
def __init__(self):
print("这是一种交通工具")
def run(self):
print ("会跑")
def carry(self):
print("可以载人")
测试,创建实例,调用
import vehicle
thisvehicle = vehicle.vehicle() #实例化对象
thisvehicle.run() #调用run方法
thisvehicle.carry() #调用carry方法
运行结果
1. init()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。
2. init()方法可接收参数
class vehicle(object):
def __init__(self,name):
print(name+"是一种交通工具")
import vehicle
thisvehicle = vehicle.vehicle("car") #实例化对象
运行结果
3. self不是python关键字,只是按照惯例它的名称是self,修改成其它也可正常执行。
继承
单继承
#创建基类vehicle
class vehicle(object):
weight = ""
#self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
#构造函数 __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
def __init__(self,name):
self.name = name
print(self.name+"是一种交通工具")
def run(self):
print (self.name+"会跑")
def carry(self):
print(self.name+"可以载人")
def setweight(self,weight): #设置属性值
vehicle.weight = weight
def getweight(self):
print(self.name+"重量属性:", vehicle.weight,"t") #获取属性值
#创建car类,继承vehicle
class car(vehicle):
#car属性
# weight = "1.5t-2t"
#car方法
def __init__(self,name):
self.name = name
print(self.name)
#car容纳人数
def capacity(self):
print(self.name+"最多可以坐7个人")
import vehicle
thiscar = vehicle.car("汽车") #实例化子类
thiscar.run() #调用父类的run方法
thiscar.carry() #调用父类的carry方法
thiscar.capacity() #调用子类的capacity方法
#打印car属性
thiscar.setweight(1.5) #调用父类的方法 - 设置属性值
thiscar.getweight() #再次调用父类的方法 - 获取属性值
运行结果
多继承
#父类Vehicle
class Vehicle(object):
def run(self):
print("父类Vehicle中的方法:会跑")
#父类car类
class Car(object):
def function(self):
print("父类car中的方法:载人到达任何一个地方")
from vehicle import Vehicle
from car import Car
#子类Bus
class Bus(Vehicle,Car):
def way(self):
print("子类Bus中的方法:公用的")
from vehicle import Vehicle
from car import Car
from bus import Bus
thisBus = Bus() #实例化Bus
thisBus.way() #调用Bus中的way方法
thisBus.run() #调用父类Vehicle中的run方法
thisBus.function() #调用父类Car中的function方法
运行结果
多态
多态:一种事物的多种形态
多态的作用
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
多态的特点
1.可替换性(substitutability) 多态对已存在代码具有可替
换性。
2.可扩充性(extensibility) 多态对代码具有可扩充性。增
加新的子类不影响已存在类的多态性、继承性,以及其他特性的
运行和操作。实际上新加子类更容易获得多态功能。
3.接口性(interface-ability) 多态是超类通过方法签名,
向子类提供了一个共同接口,由子类来完善或者覆盖它而实现
的。
4.灵活性(flexibility) 它在应用中体现了灵活多样的操
作,提高了使用效率。
5.简化性(simplicity) 多态简化对应用软件的代码编写和
修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为
突出和重要。
代码实现
#定义Animal类
class Animal(object):
def __init__(self,name):
self.name = name
def eat(self):
print(self.name+"吃")
#定义Cat类继承Animal类
from animal import Animal
class Cat(Animal):
def __init__(self,name):
#self.name = name
super(Cat,self).__init__(name)
def eat(self):
print(self.name+"吃")
#定义Mouse类继承Animal类
from animal import 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()
#多态
from cat import Cat
from mouse import Mouse
from person import Person
tom = Cat("tom")
jerry = Mouse("jerry")
per = Person()
per.feedAnimal(tom)
per.feedAnimal(jerry)
运行结果
对象属性和类属性
类属性:用类名调用的属性
class Vehicle(object):
name = "这是name属性" #定义一个name属性
def run(self):
print("父类Vehicle中的方法:会跑")
from vehicle import Vehicle
print(Vehicle.name) #用类名调用name属性
运行结果
对象属性:对象可以通过 对象名.属性名 调用对象属性
class Vehicle(object):
name = "这是name属性" #定义一个name类属性
def __init__(self,name):
#对象属性
self.name = name
from vehicle import Vehicle
print(Vehicle.name) #用类名调用name属性
thisVehicle = Vehicle("car") #实例化Vehicle
print(thisVehicle.name)
/注意事项/
1.对象属性的优先级高于类属性
2.对象属性可以动态的给对象添加对象属性,但是只针对于当前对象生效,对于类创建的其他对象没有作用
3.删除对象中的name属性,再调用会使用到同名的类属性
4.不要将对象属性与类属性重名,因为对象属性会屏蔽掉类属性。