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

一. 前言

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

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

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

1. 示例代码

class MyClass:class_attr = "I am a class attribute"def __init__(self, ins_attr):self.ins_attr = ins_attrif __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@propertydef x(self):return self._xc = MyClass(5)
print(c.x)  # 输出5

2. @classmethod

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

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

3. @staticmethod

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

class MyClass:@staticmethoddef 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@propertydef x(self):return self._x@x.setterdef x(self, value):self._x = value * 2c = 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@propertydef x(self):return self._x@x.deleterdef x(self):del self._xc = 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_propertyclass MyClass:@cached_propertydef x(self):print("Calculating x.")return 5c = MyClass()
print(c.x)  # 输出Calculating x. 5
print(c.x)  # 输出5

7.@lazy_attribute

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

from lazy_object_proxy import Proxyclass MyClass:def __init__(self):self._my_property = Proxy(self.calculate_my_property)def calculate_my_property(self):print("Calculating my_property!")return 100@propertydef my_property(self):return self._my_propertymy_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):# 实例方法的代码passinstance = MyClass()
instance.my_instance_method(arg1, arg2)

2. 类方法:

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

示例代码

class MyClass:class_var = 0@classmethoddef my_class_method(cls, arg1, arg2):# 类方法的代码cls.class_var += 1passMyClass.my_class_method(arg1, arg2)

3. 静态方法:

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

class MyClass:@staticmethoddef my_static_method(arg1, arg2):# 静态方法的代码passMyClass.my_static_method(arg1, arg2)

三. 总结:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 基础篇 day 3 运算符大全

文章目录 什么是运算符算术运算符种类举例注意运算顺序:整数除法和浮点数除法取模运算幂运算字符串拼接注意整数与浮点数之间的运算注意溢出问题 赋值运算符种类举例注意事项赋值顺序多重赋值增量赋值运算符赋值运算符链式操作注意可变对象的赋值注意不可变对象的赋…

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

AWS 提示证书签名过期无法自动更新

如果域名没有通过验证的话,证书的过去是没有办法自动更新的。 验证的方式也非常简单,通过下面的配置,把 CNAME添加到你的域名上面,AWS 就可会自动完成验证了。 当添加完成后,AWS 验证需要的时间大致在 30 分钟到 1 个…

androidstudio Please specify a signing configuration for this variant (release)

当直接运行release版本时,报错Error: The apk for your currently selected variant cannot be signed. Please specify a signing configuration for this variant (package64-release). 解决报错:添加签名,signingConfigs 写在buildTypes前…

static相关知识点详解

文章目录 一. 修饰成员变量二. 修饰成员方法三. 修饰代码块四. 修饰类 一. 修饰成员变量 static 修饰的成员变量,称为静态成员变量,该变量不属于某个具体的对象,是所有对象所共享的。 public class Student {private String name;private sta…

F5负载均衡器参与的Kubernetes架构选项介绍

F5负载均衡器在业内有着很高的知名度,因为它不仅是F5的代表作,负载均衡(Load Balance)这一词汇正是由F5发明并引入国内的。当前,F5的能力不断拓展,从早期聚焦F5负载均衡器到现在的分布式云应用架构&#xf…

如何在网页下载腾讯视频为本地MP4格式

1.打开腾讯视频官网地址 腾讯视频 2.搜索你想要下载的视频 3. 点击分享,选择复制通用代码 <iframe frameborder="0" src="ht

spring boot分装通用的查询+分页接口

背景 在用spring bootmybatis plus实现增删改查的时候&#xff0c;总是免不了各种模糊查询和分页的查询。每个数据表设计一个模糊分页&#xff0c;这样代码就造成了冗余&#xff0c;且对自身的技能提升没有帮助。那么有没有办法实现一个通用的增删改查的方法呢&#xff1f;今天…

(6)(6.2) 任务命令

文章目录 前言 6.2.1 概述 6.2.2 导航命令 6.2.3 条件命令 6.2.4 DO命令 前言 本文介绍了 Copter、Plane 和 Rover 切换到自动模式时支持的任务指令。 &#xff01;Warning 这是一项正在进行中的工作&#xff0c;尚未经过全面审核。有关 Copter 的更佳列表&#xff0c;请…

湘潭大学 湘大 XTU OJ 1325 K-Good Number 题解(非常详细)

链接 1325 题面 题目描述 如果一个整数的二进制&#xff08;无前导0&#xff09;中1的个数比0的个数多&#xff0c;我们称其为好数。如果其中1比0多k个&#xff0c;我们称其为k-好数 现在给你一个整数&#xff0c;请计算它的k。 输入 第一行一个整数T(1≤T≤10000)&#…

jvm-类加载子系统

1.内存结构概述 类加载子系统负责从文件系统或网络中加载class文件&#xff0c;class文件在文件开头有特定的文件标识 ClassLoader只负责class文件的加载&#xff0c;至于它是否运行&#xff0c;则由Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间&#xff…

初识Sentinel

目录 1.解决雪崩的方式有4种&#xff1a; 1.1.2超时处理&#xff1a; 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …