一、    引言

在较旧的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. Round 4

    最近再次经历动荡期 博客只在小白时期记录过 已经沉寂许久 之前的工作在黄区 加班超多  阻隔了一切与外网交流的可能 只能凭记忆补一点最近一年来积累到的知识 不管怎么样 不能放弃自己啊老铁!

  2. Python专题之详解enumerate和zip

    enumerate 第一个是枚举函数. 在我们的日常编程过程中,我们经常遇到一个问题. 在C语言和一些古老的语言中没有迭代器的概念,所以当我们想要遍历数组或容器时,我们只能使用下标.使用迭代器,我们的 ...

  3. Vue3教程:用 Vue3 开发小程序,这里有一份实际的代码案例!

    前言 寻寻觅觅冷冷清清,凄凄惨惨戚戚. Vue 3 发布以后,最近也在学习和写一些 Vue3 的 demo 和项目,我也一直想着什么时候能在小程序里使用新特性? 于是我翻遍了市面上的小程序框架,如 u ...

  4. sed1

    Linux sed命令 Linux 命令大全Linux sed命令是利用script来处理文本文件.sed可依照script的指令,来处理.编辑文本文件.Sed主要用来自动编辑一个或多个文件:简化对文 ...

  5. .net core 消息流处理流程

    前言 2020年即将进入尾声,分享一下在现公司业务处理流程,一起讨论在分布式场景下,如何通过消息流的方式处理各种复杂的业务场景,这里涉及到一些常用组件,后面结合场景与代码来具体说明 场景说明 这里就拿 ...

  6. 认识Redis集群——Redis Cluster

    前言 Redis集群分三种模式:主从模式.sentinel模式.Redis Cluster.之前没有好好的全面理解Redis集群,特别是Redis Cluster,以为这就是redis集群的英文表达啊 ...

  7. 太湖杯writeup

    CheckInGame checkInGame本题是个js游戏 设置个断点后,之后修改时间即可,然后把游戏玩完就行. ezWeb 本题是模板注入,过滤了{}和"",用︷︸和无引号的 ...

  8. Apache Shiro 反序列化漏洞复现(CVE-2016-4437)

    漏洞描述 Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理.只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞. 漏洞原理 A ...

  9. 微信支付回调 敏感信息解密 v3 php

    今天博主用了一波微信的v3版本的支付,支付成功后发现回调跟v2的完全不一样,于是去看了了一波v3的文档,发现信息是经过加密的,需要解密才能获取的到 但是最悲催的是文档上没写怎么解密的,经过了一下午的百 ...

  10. 深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!

    静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 publ ...