首页Python

Python面向对象编程(类与对象)

2020年9月9日 19:1859

面向对象编程是最有效的软件编写方法之一,在面向对象编程中,编写表示现实生活中的事物和情景的类,并基于这些类来创建对象。编写类时,定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独特的个性,根据类来创建对象称为实例化。

什么是面向对象

面向对象编程(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())