面向对象编程是最有效的软件编写方法之一,在面向对象编程中,编写表示现实生活中的事物和情景的类,并基于这些类来创建对象。编写类时,定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独特的个性,根据类来创建对象称为实例化。
什么是面向对象
面向对象编程(oop)是一种程序设计逻辑,在Python中所有数据类型都被视为对象,也可以自定义对象。自定义对象数据类型就是面向对象中类(class)的概念。
面向对象术语
类(class):用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象共有的属性和方法,对象是类的实例。
方法:类中定义的函数代码块
属性:属性在整个实例化的对象中是公用的,属性通常定义在默认方法(__init__)之中,属性通常不作为实例变量使用。
对象:通过类创建的数据结构实例,对象包括两个数据成员(类属性和实例变量)和方法
继承:即一个派生类(derived class)继承基类(base class)的字段和方法,继承也允许把一个派生类的对象作为一个基类的对象对待,以普通的类为基础建立专门的类对象
多态:多不同类的对象使用同样的操作
封装:对外部调用隐藏对象的工作细节
实例化:创建一个类的实例,类的具体对象
实例变量:定义在方法中的变量,只作用于当前实例的类
数据成员:类属性或者实例变量用于处理类及其实例对象的相关的数据
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写
类的定义
1、Python中定义类使用class关键字,后面紧跟类名(首字母大写)
2、类包含属性和方法
3、一个对象的特征称为"属性",一个对象的行为称为"方法"。
4、在类中定义方法的形式和函数差不多,但类中称为"方法"。调用方法需要绑定到特定的对象上(self.),而函数不需要。
class Book():
"""创建一个简单的图书类"""
def __init__(self,name,num):
"""初始化属性"""
self.book_name = name
self.book_num = num
def translate(self):
"""模拟图书入库动作"""
print("图书名称:" + self.book_name)
print("图书数量:" + str(self.book_num) + "入库成功")
__init__()是一个特殊方法,每当根据类创建实例时,Python都会自动运行它,在__init__()方法中,形参self是必不可少的,还必须位于其他形参的前面。
Python调用__init__()方法来创建实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
上面的例子,我们创建Book实例时,Python将调用Book类的__init__()方法。通过实参向Book()传递"书名"、"数量",self会自动传递,每当我们根据Book类创建实例时,都只需要给最后两个形成参(name、num)提供值。
根据类创建实例
# 创建Book类的实例对象
books = Book("Python 从入门到放弃",30) # 向Book类传递实参
# 使用Book类中的属性
print("属性:" + books.book_name)
print("属性:" + str(books.book_num))
# 使用Book类中的方法
books.translate()
属性默认值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。但有些情况下,需要设置默认值,可以在__init__()方法内指定这种初始值。
class Book():
"""定义一个图书简单类"""
def __init__(self,name,num):
"""初始化属性"""
self.book_name = name
self.book_num = num
self.book_volume = 20
def move_book(self):
"""模拟图书销售"""
print(self.book_name + " " + "销量为:" + str(self.book_volume))
books = Book("Python从入门到放弃",30)
books.move_book()
修改属性的值
class Book():
"""定义一个图书简单类"""
def __init__(self,name,num):
"""初始化属性"""
self.book_name = name
self.book_num = num
self.book_volume = 0
def move_book(self):
"""模拟图书销售"""
print(self.book_name + " " + "销量为:" + str(self.book_volume))
def update_volume(self,new_volume):
"""创建一个修改属性的方法"""
self.book_volume = new_volume
books = Book("Python从入门到放弃",30)
books.update_volume(50)
books.move_book()
类的继承
子类继承父类时,子类将自动获得父类的所有属性和方法,同时还可以定义自己的属性和方法。创建子类的实例,Python首先需要给父类的所有属性赋值。
# 创建父类,汽车(Car)类
class Car():
"""模拟汽车的类"""
def __init__(self,make,model,year):
"""初始化父类属性"""
self.make = make
self.model = model
self.year = year
def get_information(self):
"""模拟获得汽车信息"""
full_name = self.make + self.model + str(self.year)
return full_name
# 创建子类,电动汽车(ElectricCar)类,继承自父类(Car)
class ElectricCar(Car):
"""模拟电动汽车"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
my_car = ElectricCar('tesla','model s',2017)
print(my_car.get_information())