Python 中的类是一个特殊的对象。

Python 中一切皆对象:

  • class AAA:定义的类属于类对象。
  • obj1 = AAA(): 属于实例对象。

在程序运行时,类同样会被加载到内存,类是一个特殊的对象——类对象。

类对象在内存中只有一份,使用一个类可以创建出很多个对象实例。

除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法。

通过 ‘类名.’ 的方式可以访问类的属性或者调用类的方法。

一、类属性

类属性就是给类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会用于记录具体对象的特征。

类属性的特点是,所有类的实例化对象都同时共享类属性,也就是说,类属性在所有实例化对象中是作为公用资源存在的。

示例:

class Tool(object):# 使用赋值语句定义类属性,记录所有工具对象的数量count = 0def __init__(self, name):self.name = name# 让类属性的值+1Tool.count += 1# 1. 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")# 2. 输出工具对象的总数
print(Tool.count)  # 3

属性的获取机制

在 Python 中属性的获取存在一个向上查找机制。

在python中,通过 tool1.count 的方式是怎么获取属性的值的?

首先,在 Tool 类中定义了类属性 count 和 实例属性 name,我们要访问 count 属性,是通过 Tool.count 的方式进行访问。但是在 Python中,除了可以用类名的方式来访问类属性,还可以使用对象变量的方式进行访问。

假设我们实例化了 Tool 类,得到了对象 tool1,在调用 tool1.count 的时候,首先是查找的对象 tool1 中的对象,如果没有找到,那么解释器就会向上寻找类中的 count 属性,如果找到就输出,如果没有找到就报错。

这就是 python 中的属性向上查找机制。

因此,要访问类属性有两种方式:

  • 类名.类属性
  • 对象.类属性 (不推荐)

注意:如果使用"对象.类属性 = 值"的赋值语句,只会给对象添加一个属性,而不会影响到类属性的值。

示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Tool(object):# 使用赋值语句定义类属性,记录所有工具对象的数量count = 0def __init__(self, name):self.name = name# 让类属性的值+1Tool.count += 1# 1. 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")# 2. 输出工具对象的总数
tool3.count = 99
print(tool3.count)  # 99
print(Tool.count)  # 3

二、类方法

类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性或者调用其他的类方法。

Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,

Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。

语法如下:

@classmethod
def 类方法名(cls):pass

类方法需要用修饰器 @classmethod 来标识,告诉解释器这是一个类方法。

类方法的第一个参数应该是 cls,由哪一个类调用的方法,方法内的 cls 就是哪一个类的引用,这个参数和实例方法的第一个参数是 self 类似。

和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。

通过 ‘类名.’ 的方式调用类方法,调用方法时,不需要传递 cls 参数。

在方法内部,可以通过 ‘cls.’ 访问类的属性,也可以通过 ‘cls.’ 调用其他的类方法。

示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
@classmethod
def show_tool_count(cls):"""显示工具对象的总数"""print("工具对象的总数 %d" % cls.count)

三、静态方法

在开发时,如果需要在类中封装一个方法,这个方法既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法,这个时候,可以把这个方法封装成一个静态方法。

静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。

静态方法:由类调用;无默认参数。

语法如下:

@staticmethod
def 静态方法名():pass

静态方法需要用修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法。通过 ‘类名.’ 的方式调用静态方法。

静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。

示例:

class Dog(object):@staticmethoddef run():# 不访问实例属性/类属性print("小狗要跑...")# 通过类名.调用静态方法 - 不需要创建对象
Dog.run()

Python 的类其实是一个特殊的对象相关推荐

  1. Python线程类首先是一个类

    直接用代码说话,有关基本概念可查阅操作系统有关书籍和<Python程序设计>(董付国编著,清华大学出版社,2015.8第一版). import threading class myThre ...

  2. python 绘图类_关于创建自定义绘图对象-python中的类,有很好的教程吗? - python...

    我想创建一个用于自定义绘图的对象类.我正在寻找有关如何创建自己的绘图对象的面向对象入门的好教程((可能仍在使用像matplotlib这样的库)? 例如. class myplot: def __ini ...

  3. python 元类工厂模式_Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  4. 如何创建你的第一个Python元类?

    Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一.通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类.本文介绍 ...

  5. Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  6. python元类_Python元类

    python元类 Welcome to today's tutorial on python metaclass. We all know that python is an object orien ...

  7. python property类

    python属性类应用实例 一个检查修改分数的实例: class MathScore():def __init__(self, std_id, score):self.std_id = std_idi ...

  8. python人狗大战游戏_day23 python学习 类 人狗大战

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 面向过程 优点是:极大的降低了 ...

  9. python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码

    在做工程闲暇时间,将做工程过程比较重要的一些内容备份一下,如下内容段是关于演示python如何创建和使用一个简单的元类的内容,应该能对小伙伴们也有用途. #!/usr/bin/env python # ...

最新文章

  1. java性能优化方案4——不要调用高开销方法
  2. 2020中国人工智能年度评选开启,4大类别7大奖项申报正式启动
  3. 移动互联网的下个十年猜想
  4. 自从用完 Gradle 后,有点嫌弃 Maven 了!速度贼快!
  5. JavaScript | JSON基本格式
  6. ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...
  7. 全文索引--海量数据模糊查询
  8. Python配置CPLEX
  9. Python双人贪吃蛇小游戏
  10. 中国的KNX 智能家居系统,将实现最高级别的安全保障!
  11. AB Test AA Test
  12. Element概述、入门案例及布局
  13. codeforces1467E Distinctive Roots in a Tree
  14. 【论文阅读】ReDoSHunter: A Combined Static and Dynamic Approach for Regular Expression DoS Detection
  15. 系统,工具,源码,语言组成的数字世界-2021-
  16. 用python成为一名顶级黑客
  17. Erlang程序设计笔记---(第三节 Erlang的基本概念)
  18. 帧率、码率、分辨率、清晰度概念
  19. Drone CI/CD系列(二)——python语言之配置.drone.yml文件
  20. 数据结构与算法_02_局部最优的贪心算法

热门文章

  1. Java中包、类、方法、属性、常量的命名规则
  2. java并发编程与线程安全
  3. .编写一个函数实现n^k,使用递归实现
  4. python执行系统命令的方法
  5. CentOS内核编译
  6. k8s查看pod的yaml文件_【大强哥-k8s从入门到放弃04】Yaml语法解析
  7. 【MD5】加密/解密大小写问题
  8. 【汇总篇】如何利用Excel高效地处理数据
  9. 如何使用应用日志(Application Log)
  10. 采购订单收货后不能修改价格的增强