第7.4节 Python中与众不同的类

时间:2023-12-11 17:54:20

一、    引言

在较旧的Python版本中,类型和类之间泾渭分明:内置对象是基于类型的,而自定义对象是基于类的。因此,你可以创建类,但不能创建类型。在较新的Python 2版本中,这种差别不那么明显。在Python 3中,已不再区分类和类型了,类就是类型,类型就是类,如int型就是class(int)。

首先声明,除非特殊说明本章所有关于类的知识都是基于Python3.73的版本来的,有些内容在低版本特别是Python3.0以下的Python中不支持。

二、    语法

1.    创建自定义类的语法

class 类名:

执行语句...

零个到多个类变量...

零个到多个方法...

3、    语法说明:Python 的类定义由类头(指 class 关键字、类名和冒号)和统一缩进的类体构成,在类体中最主要的两个成员就是类变量和方法。如果不为类定义任何类变量和方法,那么这个类就相当于一个空类,如果空类不需要其他可执行语句,则可使用 pass 语句作为占位符。

1)    class关键字:class为类定义的声明关键字,类定义创建独立的命名空间,用于在其中定义函数和变量,这些函数和变量就是类和实例的方法和属性;

2)    类名:必须是一个合法的Python标识符(只能由字母、数字和下划线(_)构成,且不能以数字打头,且下划线开头的名称有特殊含义,一般不使用)。Python推荐的命名规范,要求类名遵循驼峰命名法,即类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符;

3)    类体:类体与函数体类似,在类头后接统一缩进的类体,可以有单独的类代码,可以有变量和函数,不过类中的函数称为方法;

4)    类定义说明文档:与函数文档字符串类似,Python 也允许为类定义文档字符串,文档字符串放在类声明之后、类体之前,如上面程序中第二行的字符串所示。

从上面定义来看,Python 的类定义有点像函数定义,都是以冒号(:)作为类体的开始,以统一缩进的部分作为类体的。区别只是函数定义使用 def 关键字,而类定义则使用 class 关键字。

三、    类的主要特征

1.    Python 类所包含的最重要的两个成员就是变量和方法,类中各成员之间的定义顺序没有任何影响,各成员之间可以相互调用;

2.    类中定义的方法包括方法则用于定义该类或实例对象的行为或功能实现,类中的方法包括类方法、静态方法和实例方法。在后面章节单独介绍;

3.    类所包含的变量又分为类变量和实例变量,类体中定义的变量为类变量,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享的属性和方法:

1)    类变量属于类本身,用于定义该类本身所包含的状态数据;

2)    实例变量则属于该类的对象,用于定义对象所包含的状态数据。

关于类变量和实例变量,在后面章节单独介绍。

4.    在class语句中定义的代码都是在一个特殊的命名空间(类的命名空间)内执行的,而类的所有成员都可访问这个命名空间。类定义其实就是要执行的代码段,类体中的代码(未在方法中的代码)在类定义时执行,当定义实例变量时类体中的代码不会再执行,这个与函数体中的代码完全不同;

5.    类还可以支持在类体中定义类,不过这种模式使用场景基本没有,在此不展开说明;

6.    Python中类的构造方法是:__init__,构造方法用于构造该类的对象,Python 通过调用构造方法返回该类的对象。构造方法在定义实例对象时执行,也就是当类被实例化的时候就会执行该函数,__init__()方法是可选的,如果不提供,Python 会给出默认的__init__方法;

7.    Python中类的析构方法是:__del__,当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。__del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数如果要显式的调用析构函数,可以使用del关键字,方式如下:del对象名

8.    Python类所包含的类变量和实例变量都可以动态增加或删除:

1)    程序也可在任何地方通过赋值语句为已有的类和实例增加变量;程序可通过 del 语句删除己有类的类变量和实例变量;

2)    程序中可以动态调整类定义,后定义的类定义将覆盖原有的类定义;

3)    程序调整类的类变量、实例变量和类定义后,已有的类的实例不受影响,如在类中删除一个实例变量a、类变量c、删除方法f后,原有的实例中还能看到a、c、f,同样新增的类变量、实例变量、类方法、实例方法,原有的实例不能使用。

9.    类中所有方法的全局空间和类本身的全局空间是同一个,但二者的局部名字空间不同。类中所有方法中的局部名字空间与全局名字空间和类本身的局部名字空和全局名字空的关系与函数和函数调用环境中局部名字空间和全局名字空间的关系一样。

四、    类定义举例

以上节介绍的鸭子类进行扩展来举例说明类的定义方法:

class Duck():
  print("现在执行Duck类类体代码,开始定义类构造函数")
  def __init__(self):
     self.sex='公鸭'
     self.age=1
     print("构造函数执行完毕!")
  print("现在定义walk方法")    
  def walk(self):
    print('I walk like a duck')
  print("现在定义swim方法") 
  def swim(self):
    print('I swim like a duck')
  print("现在定义quack方法") 
  def quack(self):
    print('I quack like a duck')
  print("现在定义类析构函数")
  def __del__(self):
      print("Duck对象析构函数执行")

第7.4节 Python中与众不同的类

     

    可以看到,类定义时,类体中没在方法外的代码全部执行,定义实例对象时,会执行构造函数,实例回收时执行析构函数,但不能直接通过”类名.方法”方式执行实例方法。

本节介绍的相关知识都是基于Python3的,实际上在Python3之前有旧式类和新式类的说法,且在Python 3之前默认创建的是旧式类,在较旧的Python版本中,要创建新式类,应在脚本或模块开头放置赋值语句__metaclass__ = type。当然,还有其他解决方案,如从新式类(如object)派生出子类。Python 3,就无需考虑这一点,因为根本没有旧式类了。因此关于这部分内容就不展开说了。

Python的类之所以说与众不同,因为它的构造方法、析构方法、类方法和实例方法、封装模式、类体代码,还有后面要提到或介绍的__new__方法、静态方法、装饰器、动态定义属性和方法等等,都与很多语言有很大的不同,因此说与众不同。

本节介绍了Python中类的语法、构成及各部分的特征,有关内容涉及面较广,如果大家不好理解,建议自己多找点资料看看。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!