一、    引言

在较旧的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对象析构函数执行")



     

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

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

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

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

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

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

第7.4节 Python中与众不同的类的更多相关文章

  1. 第7.8节 Python中隐秘的类封装方法

    前面章节已经介绍了Python中的多态和继承,本节将介绍面向对象程序设计OOP三大特征的另一个特征--封装. 一.    概念 封装是将对象的状态信息(也就是数据.属性)隐藏在对象内部,将对象的属性和 ...

  2. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  3. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  4. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  5. 第7.22节 Python中使用super调用父类的方法

    第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...

  6. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

  7. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  8. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  9. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

随机推荐

  1. ASP.NET Core框架揭秘[博文汇总-持续更新]

    第1部分 跨平台开发体验 1 跨平台开发体验 001 跨平台开发体验: Windows [上篇]         002 跨平台开发体验: Windows [中篇]        003 跨平台开发体 ...

  2. 【SpringBoot】14. SpringBoot多环境配置

    SpringBoot多环境配置 Spring Boot 1.5.19.RELEASE 假设项目中需要3个环境--开发.测试.生产 profile :代表的就是一个环境变量 语法结构:applicati ...

  3. JavaSE基础语法学习-异常

    异常 异常指程序运行中出现的不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常发生在程序运行期间,它影响了正常的程序执行流程. 比如说,你的代码少了一个分号,那么运行出来结果是提示是 ...

  4. 什么是4G模块 4G模块的工作原理及特点

    什么是4G模块 4G模块,也被叫做4G通信模块或4G DTU模块,他是物联网行业具有4G通信功能的一种产品,通过4G模块,我们可以实现工业设备数据通过无线4G网络传输到远端控制中心,并从控制中心通过4 ...

  5. jdk+tomcat 文件下载

    1.下载jdk+tomcat 链接:https://pan.baidu.com/s/1DQ-l2S4th9BoucWqAymmLg :密码: zdd3 备:tomcat是解压包,直接解压就能用,但需配 ...

  6. nginx&http 第三章 ngx http ngx_http_process_request_headers

    HTTP 请求行正确处理完成后,针对 HTTP/1.0 及以上版本紧接着要做的就是请求 HEADER 的处理与解析了 /** * 用于处理http的header数据 * 请求头: * Host: lo ...

  7. 【java从入门到精通】day-07-逻辑运算符-位运算符-条件运算符-扩展赋值运算符

    逻辑与(&&).或(||).非(!) 示例: package operator;​public class Demo05 {    public static void main(St ...

  8. 希捷powerchoice磁盘休眠功能arm打包

    官方只提供了x86下面的包,没有提供arm下面的包,而我们的arm机器是32位的,需要编译一个支持armhf的二进制文件,这个文件只需要一个即可,但是编译是整套编译的,并且我们需要选定指定的版本,关闭 ...

  9. rbd无法map(rbd feature disable)

    在jewel版本下默认开启了rbd的一些属性 [root@lab8106 ~]# ceph --show-config|grep rbd|grep features rbd_default_featu ...

  10. inkscope完整安装配置

    准备centos7基础系统 首先安装基础系统centos7 在安装选项那里选择base web server ,选择其他的也可以,选择mini安装会缺很多常用的软件包,后续需要一个个安装比较麻烦 关闭 ...