购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 面向对象编程

2.6.1 类的概念

Python语言同时支持面向过程和面向对象的编程方式。在面向过程的编程中,程序主要以过程或函数为中心来设计,通过将一些代码组合成一个函数来实现特定的功能。在这种编程方式中,程序员将代码分解成较小的、可重复使用的部分,以便于代码维护和复用。这种设计方式具有很好的结构性和可读性,因为代码流程比较直观,符合人们的思维方式。

面向对象是Python编程中一个非常重要的概念。在面向对象编程中,程序设计主要围绕对象展开,通过创建不同的对象来模拟现实世界中的事物或概念,并通过对象之间的交互来实现功能。

在Python中,任何事物都是一个对象,它们都拥有自己的属性和方法。通过定义类和实例化对象,可以将相似的对象抽象出来,并赋予它们自己的属性和方法。同时也可以利用继承和多态等特性,实现代码的复用和扩展。

面向对象编程的优点在于能够更好地组织和管理代码,使代码结构更加清晰、易于理解和维护。同时,它也可以提高代码的复用性,避免重复编写代码。

在Abaqus二次开发中,内核程序由于其本身设计的特点,采用了面向过程的编程方式,而插件程序GUI和主窗口GUI的开发则更多地运用了面向对象的编程思想。这是因为面向对象编程能够更好地处理大量的交互式界面和图形化界面,使得程序更加易于维护和扩展,同时也更加符合用户的使用习惯和需求。

面向对象的基础是“类”。什么是类?类可以认为是一个模板,用于创建各种对象。同一模板创建出的对象都拥有相同的技能,但各自的特征可能不相同。打个比方,鱼类是一个总称,也是一个模板,所有鱼类都会游泳,也能在水中呼吸,但不同鱼类的外观、颜色和大小则不尽相同。如果把鱼类比作类,各式各样的鱼则是由鱼类这个类创建出的对象。

Python语言中流行这么一句话:“Python中一切皆对象”。从计算机的角度来说,对象包含三个内容:id、type和value。id是内存地址、type是数据类型、value是属性(attribute)和方法(method)的合称。id和type容易理解,value中的属性相当于鱼的特征,方法则对应鱼的技能。

类也是对象,称为类对象。将类实例化后产生的对象称为实例对象。所谓实例化,就是从鱼类中挑选出一种鱼的过程,选出来的鱼则是实例对象。

定义类的语法格式为:

类名的首字母一般为大写,类名如果由几个单词组合在一起,尽可能采用“驼峰原则”,即每个单词的第一个字母大写。如果有继承,类名后添加小括号,并输入继承的父类名。和函数一样,类语句的首行可以用三引号来说明类的信息。例如一个空类可以定义为:

2.6.2 初始化方法、实例属性和实例方法

属性是类中的数据成员,可以认为属性是用初始化方法__init__()定义的,初始化方法的特点是每当对类进行实例化时,它能被自动调用,根据这个特点,通常在初始化方法中设置实例属性的初始值。例如:

上例定义了一个名为FishA的类,类中只有初始化方法__init__(),当中的参数就是实例对象拥有的属性,这里定义了两个实例属性color和size。代码运行结果为:

使用初始化方法__init__()时要遵循以下要点。

1)名称固定,必须为__init__(),init前后均为两个下画线。

2)小括号中第一个参数固定,通常都是self。

3)不需要也不能给self传参。

4)初始化方法中没有return语句。

上例第5行需通过“类名(参数)”的方式将类实例化。实例化过程中会自动调用初始化方法,使实例对象具备color和size这两个实例属性。其中,color为固定值,size则可以根据实际需求赋值,此处传入字符串“较小”。

这里有一个约定俗成的习惯,实例属性的名称与形参的名称是一样的,比如第4行的self.size=size,前面的size是实例属性名,后面的size是形参。

实例属性是每个实例对象所独有的属性,可以通过实例对象的名称来访问和修改,它不仅可以被实例对象调用,在类的实例方法中也可以通过self来访问实例属性,因为在方法内部的self指向调用该方法的实例对象。

创建实例属性后,便可创建实例方法。实例方法是从属于实例对象的方法,实例方法的创建方式几乎和函数一样,不同之处在于实例方法的第一个参数必须是self。例如:

运行结果为:

第5行和第6行创建名为describe的实例方法,方法中调用了两个实例属性。实例化后,实例对象fishA具备了实例属性color和size,以及实例方法describe()。

2.6.3 类对象和类属性

1. 类对象

前面提到过,Python中一切都是对象,类也是对象,类对象自身也有属性和方法。Python解释器在执行class语句时就已经创建了一个类对象,对象都包含id、type和value。以最简单的空类为例:

上例创建名为FishB的空类,并没有将类实例化,而是直接查看类本身的信息。第3行和第4行打印出类对象FishB的id和type,第5行的内置函数dir()可以列出对象拥有的属性名和方法名,即便是空类也有一些信息。运行结果为:

2. 类属性

类属性是从属于类对象的属性,也称为类变量。定义类属性的语法格式为:

一般来说,类属性定义在最上方,定义的方式与普通变量赋值一样,例如:

代码运行结果为:

上例的第2行定义了类属性hometown。第6行的实例方法中可以通过类名.或self.调用类属性的方式访问。同时,类属性作为类对象的属性,类对象和实例对象都能访问,例如第7行的类对象和第9行的实例对象都访问了hometown,在所有实例对象中,类属性的值都是相同的。本书Abaqus GUI二次开发的章节中会运用到类属性的相关内容。

2.6.4 继承和重写

Python作为面向对象的语言,同样支持面向对象编程的三大特征——继承、封装和多态,其中继承是Abaqus GUI二次开发中必须掌握的要点。

继承是面向对象编程中一个非常重要的概念,它可以让子类继承父类的属性和方法,并且在此基础上添加新的属性和方法。通过继承可以避免重复编写大量代码,提高代码的重用性和可维护性,大大减轻工作量。

如果B类继承了A类,A类就称为父类或者基类,B类则称为子类或者派生类,这样B类就能够直接使用A类中定义的属性和方法。此外,子类还可以在继承父类的基础上,增加新的属性和方法,以满足子类的需求。继承的语法格式为:

继承的方式很简单,定义子类时,通过后面的小括号指定父类即可。Python支持多重继承,父类可以多于一个。下面是一个继承的例子:

第1行~第5行定义了名为FishD的父类,其中定义了一个实例属性skill和实例方法introduce。接着第6行~第13行定义了子类FishE,它继承自父类FishD。在子类中定义实例属性时要注意,如果子类中不定义初始化方法,那么会自动继承父类的初始化方法和实例属性。但如果子类中需要定义初始化方法,那么父类中的实例属性不能直接继承,而必须在子类中显式地调用父类的初始化方法后,才能继承父类的实例属性。在上例中,子类需要定义新的实例属性species和hometown,在第7行定义了初始化方法,为了顺利继承父类的实例属性skill,在第8行由父类调用__init__(),其中的参数包含父类的实例属性,然后在第9行~第10行定义子类的两个实例属性。

继承的目的还在于对父类的实例方法进行重写。重写可以在不改变父类的情况下重新定义父类的实例方法。在第11行~第13行中,子类对名为introduce()的实例方法进行了重写,这样会覆盖继承而来的实例方法,但父类并不受影响。

第14行中,传入必要的实参,将子类实例化,得到的实例对象赋值给变量fishE。第15行中,子类的实例对象fishE调用实例方法introduce(),即可打印重写之后的语句,运行结果为:

Python允许多重继承,比如子类C同时继承A类和B类,定义时可以写成class C(A,B)。如果A类和B类中有同名方法或属性,子类将按照从左到右的顺序使用第一个找到的方法或属性。使用过程中,多重继承可能会把类的层次复杂化,应尽可能只继承一个父类。 NYsbZCGg6I3rG703WWQkDHiGCtHs2DfWyB7McV+mGTUKj/R+9Ul8/IMn4D8qumDg

点击中间区域
呼出菜单
上一章
目录
下一章
×