python 面向对象的属性,类方法,静态方法,实例方法的区别及用法详解

news2024/12/23 23:19:14

一. 前言

  • 在Python的面向对象编程中,类属性和实例属性是两个不同的概念,它们在作用域和使用方式上有所区别。
  • Python中的面向对象编程中有三种方法:实例方法、类方法和静态方法,它们之间的差异主要体现在参数传递和调用方式上。

二. 面向对象 - 类属性和实例属性

在 Python 中,类属性和实例属性的区别在于它们的作用域不同。类属性属于类本身,在整个类中都是可见的;而全局属性是在所有的作用域中都是可见的。

1. 示例代码

class MyClass:
    class_attr = "I am a class attribute"

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


if __name__ == '__main__':
    obj1 = MyClass("I am an instance attribute of obj1")
    obj2 = MyClass("I am an instance attribute of obj2")

    print(obj1.class_attr)  # 输出 "I am a class attribute"
    print(obj2.class_attr)  # 输出 "I am a class attribute"

    print(obj1.ins_attr)  # 输出 "I am an instance attribute of obj1"
    print(obj2.ins_attr)  # 输出 "I am an instance attribute of obj2"

    obj1.class_attr = "I am a new update class attribute of obj1"
    print(obj1.class_attr)  # 输出 "I am a new update class attribute of obj1"
    print(obj2.class_attr)  # 输出 "I am a class attribute"

    MyClass.class_attr = "I am a new MyClass attribute"
    print(obj1.class_attr)  # 输出 "I am a new update class attribute of obj1"
    print(obj2.class_attr)  # 输出 "I am a new MyClass attribute"
    print(MyClass.class_attr)  # 输出 "I am a new MyClass attribute"

上面的代码中,我们定义了一个 MyClass 类,其中有一个类属性 class_attr 和一个实例属性 name。在实例化 obj1 和 obj2 之后,我们分别访问了它们的实例属性和类属性,然后我们修改了类属性的值,并且分别访问了两个实例的类属性值,最后打印了每个实例的属性值。

运行结果如下

在这里插入图片描述
从以上运行结果可以看到,

  • 当我们根据使用实例对象修改类属性时,该实例对象的类属性会改变,但只会作用于自身(修改的实例对象)
  • 当我们通过直接修改类属性时,类属性会发生改变,并且生效作用于其他的实例对象,其他的实例对象访问结果会变成类修改类属性后的结果,而实例对象修改过后的类属性却没有受到影响

总结一下,类属性是一个类的全局变量,所有实例对象共享一个值,可以通过类名或实例对象访问;而实例属性属于实例对象私有的属性,每个实例对象都有自己的值,只能通过实例对象访问。在实际开发中,需要根据实际情况选择类属性和实例属性的使用

2. 常用的类属性装饰方式及用法

1. @property

将一个方法转换成属性,可以像访问属性一样访问。

class MyClass:
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x
    
c = MyClass(5)
print(c.x)  # 输出5

2. @classmethod

将一个方法声明为类方法,用类名调用。

class MyClass:
    x = 0
    
    @classmethod
    def classmethod(cls):
        cls.x += 1
        return cls.x
    
print(MyClass.classmethod())  # 输出1
print(MyClass.classmethod())  # 输出2

3. @staticmethod

将一个方法声明为静态方法,可以不需要实例化对象就能够调用。

class MyClass:
    @staticmethod
    def staticmethod():
        return "This is a static method."
    
print(MyClass.staticmethod())  # 输出"This is a static method."

4. @get.setter

用于设置属性值的方法,必须定义在@property方法下面。

class MyClass:
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x
    
    @x.setter
    def x(self, value):
        self._x = value * 2
    
c = MyClass(5)
print(c.x)  # 输出5
c.x = 10
print(c.x)  # 输出20

5. @get.deleter

用于删除属性的方法,必须定义在@property方法下面。

class MyClass:
    def __init__(self, value):
        self._x = value
    
    @property
    def x(self):
        return self._x
    
    @x.deleter
    def x(self):
        del self._x
    
c = MyClass(5)
print(c.x)  # 输出5
del c.x
# print(c.x)  # AttributeError: 'MyClass' object has no attribute '_x'

6. @cached_property

缓存属性,只计算一次,后续访问直接返回缓存值。

from cached_property import cached_property

class MyClass:
    @cached_property
    def x(self):
        print("Calculating x.")
        return 5
    
c = MyClass()
print(c.x)  # 输出Calculating x. 5
print(c.x)  # 输出5

7.@lazy_attribute

在第一次访问该属性时才进行计算,之后返回缓存值。

from lazy_object_proxy import Proxy

class MyClass:
    def __init__(self):
        self._my_property = Proxy(self.calculate_my_property)

    def calculate_my_property(self):
        print("Calculating my_property!")
        return 100

    @property
    def my_property(self):
        return self._my_property

my_class = MyClass()
print(my_class.my_property) # Output: Calculating my_property! 100
print(my_class.my_property) # Output: 100

二. 面向对象 - 类方法,静态方法,实例方法

1. 实例方法:

在Python中,类中的所有函数默认都是实例方法,实例方法是将self作为第一个参数的方法,它可以通过实例化一个对象来调用,它可以访问实例中的数据,也可以修改实例中的数据,最常用的方法之一。

示例代码

class MyClass:
    def my_instance_method(self, arg1, arg2):
        # 实例方法的代码
        pass

instance = MyClass()
instance.my_instance_method(arg1, arg2)

2. 类方法:

类方法是将cls作为第一个参数的方法,它可以通过类名或对象名来调用,也可以修改类变量,但是它不能访问实例变量,类方法使用@classmethod装饰器来定义。

示例代码

class MyClass:
    class_var = 0

    @classmethod
    def my_class_method(cls, arg1, arg2):
        # 类方法的代码
        cls.class_var += 1
        pass

MyClass.my_class_method(arg1, arg2)

3. 静态方法:

这种方法也是类成员方法,但它们不需要访问类或实例的上下文。静态方法可以像普通函数一样被调用,没有默认的参数。
静态方法不需要传递任何参数,它与类和实例无关,可以使用类名或对象名来调用,因此静态方法不能访问实例变量或类变量,静态方法使用@staticmethod装饰器来定义。

class MyClass:
    @staticmethod
    def my_static_method(arg1, arg2):
        # 静态方法的代码
        pass

MyClass.my_static_method(arg1, arg2)

三. 总结:

  • 实例方法是最常用的方法类型,只能被实例调用,第一个参数是self
  • 类方法和静态方法都是类成员方法,可以通过类或实例调用;
  • 类方法第一个参数是cls,表示当前类对象;
  • 静态方法没有默认参数,类的上下文不会传递给它。

以上就是关于python中面向对象的属性,类方法,静态方法,实例方法的区别及用法详解,希望对你有所帮助,请不吝你的三连,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高危】WPS Office 远程代码执行漏洞(WPSSRC-2023-0701绕过) (MPS-qjky-hw9x)

zhi.oscs1024.com​​​​​ 漏洞类型代码注入发现时间2023-08-22漏洞等级高危MPS编号MPS-qjky-hw9xCVE编号-漏洞影响广度广 漏洞危害 OSCS 描述 WPS Office 软件是由金山办公软件股份有限公司自主研发的一款办公软件套装。 由于对 WPSSRC-2023-0701 的修复不充分,…

Hive面试自学版

1.什么是HIVE? Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 Hive是一个基于Hadoop的数据仓库工具,可以将结构化数据文件映射为一张表,…

SpringBoot 2.7 集成 Netty 4 模拟服务端与客户端通讯入门教程

文章目录 1 摘要2 核心 Maven 依赖3 核心代码3.1 服务端事务处理器 (DemoNettyServerHandler)3.2 服务端连接类(InitNettyServer)3.3 客户端事务处理器(DemoNettyClientHandler)3.4 客户端连接类(DemoNettyClient) 4 测试4.1 测试流程4.2 测试结果4.3 测试结论 5 推荐参考资料6…

Datax、Datax-web 安装部署

Datax安装(Windows) 1、源码地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本。 2、下载安装包并解压(安装前需有jdk、python开发环境):https://github.com/alibaba/DataX/archiv…

游戏开发服务器选型的横向对比

来源一个某乎的作者,貌似来自台湾 上篇介绍了go版本的游戏服务器,这篇介绍下其它语言版本: SkynetkbengineNoahGameFramePomeloPinusET使用的语言C/LuaCCNodejsTypeScriptC#概述云风前辈开源的框架mmo框架server一个快速的、可扩展的、分布…

【Prometheus】概述及部署

目录 Prometheus 概述 Prometheus 的生态组件 Prometheus 的工作模式 Prometheus 的工作流程 Prometheus 的局限性 部署 Prometheus Prometheust Server 端安装和相关配置 部署 Exporters 监控 MySQL 配置示例 监控 Nginx 配置示例 部署 Grafana 进行展示 部署 Pro…

Java如何调用接口API并返回数据(两种方法)

Java如何调用接口API并返回数据(两种方法) java处理请求接口后返回的json数据-直接处理json字符串 处理思路: 将返回的数据接收到一个String对象中(有时候需要自己选择性的取舍接收) 再将string转换为JSONObject对象 …

Shiro学习总结

第一章 入门概述 1.概念 shiro是一个Java安全框架,可以完成:认证、授权、加密、会话管理、与web集成、缓存… 2.优势 ● 易于使用,构建简单 ● 功能全面 ● 灵活,可以在任何应用程序环境中工作,并且不需要依赖它们…

log4框架

1.log4cplus基本元素 Layouts :控制输出消息的格式。 Appenders :输出位置。 Logger :日志对象。 Priorities :优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。 2.log4cplus基本结构 3. 使用步骤&am…

2023年7月最新道路矢量数据(全国/分省/分城市)

2023年7月最新道路矢量数据(全国/分省/分城市) 道路数据是我们在各项研究中经常使用的数据!道路数据虽然很常用,但是却基本没有能下载最近年份道路数据的网站,所以很多人不知道如何获到道路数据。 本次我们为大家推…

【80天学习完《深入理解计算机系统》】第九天 3.2 数据传送指令【mov】【栈和堆】【leaq】【一元操作】【二元操作】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

智慧充电桩物联网方案架构

智慧充电桩物联网采用“云-管-边-端”的边缘计算物联网架构,融合5G、AI、Wi-Fi 6等技术,实现充电基础设施由数字化向智能化演进。智慧充电桩物联网方案架构设计,如下图所示: 云端: 物联网平台具备广泛协议的南向接入…

.NET 最便捷的Log4Net日志记录器

最便捷的Log4Net使用方法 LOG4NET 配置日志记录器开始引用nuget LOG4NET 配置日志记录器 Apache log4net 库是一个帮助程序员将日志语句输出到各种的工具 的输出目标。log4net是优秀的Apachelog4j™框架的移植 Microsoft.NET 运行时。我们保持了与原始log4j相似的框架 同时利…

【javaweb】学习日记Day5 - 请求响应 分层解耦 IOC DI 三层架构

目录 一、请求响应 1、请求 (1)简单参数 ① GET请求 ② POST请求 ③ 假如形参与请求参数不一致 (2)实体参数 ① 简单实体对象 ② 复杂实体对象 (3)数组参数 (4)集合参数 …

研究生定向培养学徒对象及说明

研究生定向培养学徒开始招募啦,招募对象可以 1、免费学习 2、全真企业项目实战 3、拥有就业推荐机会 4、提供副业机会 研究生定向培养学徒报名时间: 2023年8月22日-2023年9月10日 研究生定向培养学徒招募对象: 1.毕业年度研究…

如何在地平线J5上部署RTA-VRTE v2.2应用程序

在地平线J5上部署RTA-VRTE v2.2应用程序流程图: 虽然在J5上使用ifconfig 命令看不到can0和can1被启动 登陆系统后ifconfig -a仍然能看到can0和can1。

Python(八十四)字符串的切片操作

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Linux TCP协议——三次握手,四次挥手

一、TCP协议介绍 TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构: 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;(tcp是传输层的协议,端与端之间的数据传输,在TCP和UDP协议当中不会体现出I…

基于paddleocr的文档识别

1、版面分析 使用轻量模型PP-PicoDet检测模型实现版面各种类别的检测。 数据集: 英文:publaynet数据集的训练集合中包含35万张图像,验证集合中包含1.1万张图像。总共包含5个类别。 中文:CDLA据集的训练集合中包含5000张图像&a…

Vue3:通过路由写多个页面,通过不同的路径可以进入不同的页面

前言 Vue3:想通过路由写2个页面,不同的路径可以进入不同的页面 实现步骤 1、创建Vue3项目 通过脚手架创建一个Vue3的项目,然后在此基础上对文件进行增删改,修改成自己需要的项目框架 2、views文件夹 对应 页面文件 如果需要…