在前面的内容,我们多次提到了数据类、对象等概念,这些同属面向对象编程的范畴。对象,简单理解即是由某个类经过初始化产生的一个数据,或对象属于某个类。对象通常有很多类实现声明或定义的属性、方法函数。每个对象的属性可以不同,因此其某些函数的产生结果也有差异。例如:
> 设计“狗”是一个类, “品种”是它的属性,“活动”是它的动作方法或抽象为函数方法。
< “金毛”、“哈士奇”是由“狗”声明的一个对象,即“金毛”、“哈士奇”属于“狗”,且不同品种就是这个对象的一种属性;同时,金毛“活动”起来显得“比较聪明”,哈士奇则是“比较笨拙”。
面向对象是编程中一个庞大且复杂的内容,我们多花几个章节来慢慢讲述。
一、面向对象技术简介
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。在面向编程过程中,通常会涉及到以下的几个概念:
类(Class):用来描述具有相同的属性和方法(函数)的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例,如整数1是整数类int的一个对象。
对象:由类生成的数据结构实例,包括数据成员(类变量和实例变量)和方法。
类变量:类变量在整个实例化的对象中是公用的,定义在类中且在函数体之外,通常不作为实例变量使用。
实例变量或属性:类声明中,属性用变量来表示,称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
数据成员:类变量或实例变量, 用于处理类及其实例对象的相关的数据。
成员方法或函数:类中定义的独属于该类的调用函数,可以直接访问类中属性,通常经过对象进行调用。
继承:即派生类(Derived Class)继承基类(Base Class)的属性和方法。例如, Dog类继承自Animal类,模拟“是一个(is-a)”关系。
方法重写:继承时,父类的方法不满足子类需求,可以对其进行重写(或覆盖,Override)。
二、创建类及其对象
Python中使用“class”关键字来创建类,例如创建Dog类并实例化两个具有不同属性的对象:
class Dog:# 类变量,所有对象共享dogs_count = 0 # 记录狗的创建数量def __init__(self, breed: str, hair_color: str):# 实例变量,每个对象独有self.breed = breedself.hair_color = hair_colorDog.dogs_count += 1# 成员方法或成员函数def action(self) -> str:if self.breed == "金毛":return "它的行为很聪明!"elif self.breed == "哈士奇":return "它的行为有点蠢!"return "不明狗品种!"dog1 = Dog(breed="金毛", hair_color="golden")dog2 = Dog(breed="哈士奇", hair_color="black-white")
代码中:
方法“__init__”是一个特殊的类方法,可以成为类的构造函数或初始化方法,创建对象时会自动调用。构造函数可以省略,解释器会自动补充。如果创建对象时就需初始化对象的某些属性,则必须手动添加构造函数。
self代表类的实例,类似C++、Java等中的this,可以理解为其指代了一个虚拟的对象来补充代码中调用属性或类方法时的对象缺失。如果函数是类的成员函数,则函数的形参第一个必须是self,但在调用时不必向self传参,从self后的第一个形参开始传参。
dogs_count为类变量,此变量的变动对所有对象生效,因此通常不通过对象访问该属性,而是通过类名,如__init__中的Dog.dogs_count。
创建对象时,使用“类名(参数)”的形式,参数即为“__init__”中声明的参数,可以理解为创建对象时执行了“类名.__init__(args)”的函数调用操作。
往期回顾:
PyEcharts数据占比之饼图和环形图|PyEcharts篇Part.6
零前端高颜值可视化图表交互,PyEcharts攻略|Part.7