Python中类属性和类方法

这篇具有很好参考价值的文章主要介绍了Python中类属性和类方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 类的结构

1.1 术语 —— 实例

  1. 使用面相对象开发,第 1 步 是设计 类
  2. 使用 类名() 创建对象,创建对象 的动作有两步:
    (1) 在内存中为对象 分配空间
    (2) 调用初始化方法 __init__ 为 对象初始化
  3. 对象创建后,内存 中就有了一个对象的 实实在在 的存在 —— 实例
Python中类属性和类方法

因此,通常也会把:

  • 创建出来的 对象 叫做 类的实例
  • 创建对象的 动作 叫做 实例化
  • 对象的属性 叫做 实例属性
  • 对象调用的方法 叫做 实例方法

在程序执行时:

  • 对象各自拥有自己的 实例属性
  • 调用对象方法,可以通过 self.
    • 访问自己的属性
    • 调用自己的方法

结论

  • 每一个对象都有自己独立的内存空间,保存各自不同的属性。
  • 多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部。

1.2 类是一个特殊的对象

Python 中 一切皆对象:

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

在 Python 中,类是一个特殊的对象 —— 类对象。
在程序运行时,类 同样 会被加载到内存中,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例。

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

  • 类属性
  • 类方法

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

Python中类属性和类方法

2. 类属性和实例属性

2.1 概念和使用

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

【示例需求】:

  • 定义一个 工具类
  • 每件工具都有自己的 name
  • 需求 —— 知道使用这个类,创建了多少个工具对象?
Python中类属性和类方法
class Tool(object):

    # 使用赋值语句,定义类属性,记录创建工具对象的总数
    count = 0

    def __init__(self, name):
        self.name = name

        # 针对类属性做一个计数+1
        Tool.count += 1


# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")

# 知道使用 Tool 类到底创建了多少个对象?
print("现在创建了 %d 个工具" % Tool.count)  # 3

2.2 属性的获取机制

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

Python中类属性和类方法

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

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

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

3. 类方法和静态方法

3.1 类方法

  • 类属性 就是针对 类对象 定义的属性
    • 使用 赋值语句 在 class 关键字下方可以定义 类属性
    • 类属性 用于记录 与这个类相关 的特征
  • 类方法 就是针对 类对象 定义的方法
    • 在 类方法 内部可以直接访问 类属性 或者调用其他的 类方法

语法如下:

@classmethod
def 类方法名(cls):
    pass
  • 类方法需要用 修饰器 @classmethod 来标识,告诉解释器这是一个类方法
  • 类方法的 第一个参数 应该是 cls
    • 由 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引用
    • 这个参数和 实例方法 的第一个参数是 self 类似
    • 提示 使用其他名称也可以,不过习惯使用 cls
  • 通过 类名. 调用 类方法,调用方法时,不需要传递 cls 参数
  • 在方法内部
    • 可以通过 cls. 访问类的属性
    • 也可以通过 cls. 调用其他的类方法

【示例需求】:

  • 定义一个 工具类
  • 每件工具都有自己的 name
  • 需求 —— 在 类 封装一个 show_tool_count 的类方法,输出使用当前这个类,创建的对象个数
Python中类属性和类方法
@classmethod
def show_tool_count(cls):
    """显示工具对象的总数"""
    print("工具对象的总数 %d" % cls.count)

在类方法内部,可以直接使用 cls 访问 类属性 或者 调用类方法。

3.2 静态方法
在开发时,如果需要在 类 中封装一个方法,这个方法:

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

语法如下:

@staticmethod
def 静态方法名():
    pass
  • 静态方法 需要用 修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法
  • 通过 类名. 调用 静态方法
class Dog(object):
    
    # 狗对象计数
    dog_count = 0
    
    @staticmethod
    def run():
        
        # 不需要访问实例属性也不需要访问类属性的方法
        print("狗在跑...")

    def __init__(self, name):
        self.name = name

3.3 方法综合案例

需求

  • 设计一个 Game 类
  • 属性:
    • 定义一个 类属性 top_score 记录游戏的 历史最高分
    • 定义一个 实例属性 player_name 记录 当前游戏的玩家姓名
  • 方法:
    • 静态方法 show_help 显示游戏帮助信息
    • 类方法 show_top_score 显示历史最高分
    • 实例方法 start_game 开始当前玩家的游戏
  • 主程序步骤
    • 查看帮助信息
    • 查看历史最高分
    • 创建游戏对象,开始游戏
Python中类属性和类方法
class Game(object):

    # 游戏最高分,类属性
    top_score = 0

    @staticmethod
    def show_help():
        print("帮助信息:让僵尸走进房间")
        
    @classmethod
    def show_top_score(cls):
        print("游戏最高分是 %d" % cls.top_score)

    def __init__(self, player_name):
        self.player_name = player_name

    def start_game(self):
        print("[%s] 开始游戏..." % self.player_name)
        
        # 使用类名.修改历史最高分
        Game.top_score = 999

# 1. 查看游戏帮助
Game.show_help()  # 帮助信息:让僵尸走进房间

# 2. 查看游戏最高分
Game.show_top_score()  # 0

# 3. 创建游戏对象,开始游戏
game = Game("小明")

game.start_game()  # 小明 开始游戏啦。。。

# 4. 游戏结束,查看游戏最高分
Game.show_top_score()  # 999

案例小结文章来源地址https://www.toymoban.com/news/detail-420587.html

  • 实例方法 —— 方法内部需要访问 实例属性
  • 实例方法 内部可以使用 类名. 访问类属性
  • 类方法 —— 方法内部 只 需要访问 类属性
  • 静态方法 —— 方法内部,不需要访问 实例属性 和 类属性

参考资料

  1. Python中类属性和类方法:https://blog.csdn.net/weixin_46351593/article/details/119892412
  2. Python之@staticmethod和@classmethod的作用与区别:https://blog.csdn.net/u012856866/article/details/119566825

到了这里,关于Python中类属性和类方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot】Spring Boot中类的实例化

    在Spring Boot中,类的实例化通常是由Spring框架处理的。Spring使用控制反转(IoC)和依赖注入(DI)的概念来管理类的实例化和依赖关系。 要在Spring Boot中实例化一个类,可以遵循以下几个步骤: 1. 在类上使用`@Component`、`@Service`、`@Repository`或`@Controller`等注解来标识这个类是一

    2024年02月10日
    浏览(33)
  • Vue3 全局实例上挂载属性方法

    导语 在大多数开发需求中,我们有时需要将某个数据,或者某个函数方法,挂载到,全局实例身上,以便于,在项目全局的任何位置都能够调用其方法,或读取其数据。 在Vue2 中,我们是在 main.js 中 直接将数据或者方法绑定在 Vue.prototype 身上,在页面中,可以直接通过 thi

    2024年02月02日
    浏览(27)
  • ChatGPT专业术语及有效使用方法概述

    . 目录 一、摘要 二、ChatGPT基本介绍 三、ChatGPT技术原理 四、ChatGPT数据训练 五、ChatGPT微调方法 六、ChatGPT应用案例 七、有效使用ChatGPT的方法 八、结论 一、 摘要 本文将详细介绍ChatGPT的专业术语及有效使用方法,包括对ChatGPT的基本介绍、技术原理、数据训练、微调方法、应

    2024年02月07日
    浏览(39)
  • 一文解释python中的实例方法,类方法和静态方法作用和区别是啥?该如何使用

    我们都知道 ,python类中有三种常见的方法 ,分别是实例方法 ,类方法和静态方法 。那么这几个方法到底有什么作用 ? 它们之间有什么区别 ?该如何使用 ? 带着这些问题 ,下面我们就来了解下这三种方法 。 若我们要实现一个学生的类 ,里面要实现3功能,分别是: 功能

    2024年02月10日
    浏览(34)
  • C#学习系列之密闭类、接口、结构和类

    基础学习 类似string这种不想再继续继承和修改下去,使用sealed声明。 派生类中用sealed和override,无法继续重写。 接口就是指定一组函数成员,而不实现他们的引用类型。需要使用interface来声明,同时成员默认为public,不能加任何访问修饰符。 只能用来被实现,继承接口,然

    2024年02月06日
    浏览(40)
  • C++的结构体(struct)和类(class)对比

    在C++中,结构体(struct)和类(class)都是用户自定义的数据类型,用于封装数据和方法。结构体通常用于定义一些简单的数据结构,而类则更多的用于面向对象的编程。 两者的不同之处如下: 结构体 (struct)是一种简单的数据集合,它可以包含不同类型的成员变量,但默

    2024年02月15日
    浏览(44)
  • python中的os.mkdir和os.makedirs的使用区别,以及如何查看某个模块中的某些字母开头的属性方法

    os.mkdir(dir_name) :用于 新建文件夹 ,当要新建的文件夹已经存在的时候,就会报错: FileExistsError: [Errno 17] File exists: 因此,我们一般在新建一个文件夹的时候,会和 os.path.exists() 集合使用,如下: 1、判断一个 文件夹是否存在 ,如果不存在就新建它,如果已经存在就跳过:

    2023年04月08日
    浏览(53)
  • 【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析

    前言     首先,热烈祝贺家姐申请到了国家自然科学基金(8月底),找一些化学领域的程序和软件,助我姐一臂之力,顺便自己研究一下源码。 卟啉类化合物的结构分析 PorphyStruct,一种用于分析不同卟啉类非平面畸变模式的新型数字工具 - 该程序利用法向坐标结构分解技术

    2024年02月09日
    浏览(34)
  • 【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境

     🌈个人主页: Sarapines Programmer  🔥 系列专栏: 本期文章收录在《C语言闯关笔记》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!  ⏰翰墨致赠:文墨扬长风,情随碧波舞。江山孕雄心滚滚,志立云霄梦遨游。 ​  🎉欢迎大家关注🔍点赞👍收藏⭐️留言📝

    2024年02月03日
    浏览(39)
  • Python中类的继承细讲

      在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间 存在一定的继承关系 时,就可以 通过继承来达到代码重用 的目的,提高开发效率。下面将介绍如何在 Python 中实现 继承 。    继承 是 面向对象编程最重要的特性之一 ,它源于人们认

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包