Python:类的属性(实例属性、类属性)和方法(实例方法、类方法、静态方法)

news2024/9/9 7:48:05

相关阅读

Pythonicon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12403403.html?spm=1001.2014.3001.5482


        Python是一门面向对象的编程语言,其核心概念之一是类。类是对象的蓝图或模板,定义了对象的属性和方法。理解类的属性和方法对于掌握Python编程至关重要。本文将深入探讨Python中的类的属性和方法,帮助读者全面掌握这一重要主题。

1、类和实例

        在Python中,类是使用class关键字定义的。类定义了对象的属性和方法,实例是类的具体实现。下面是一个简单的类定义示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建类的实例
person1 = Person("Alice", 30)

        在这个例子中,Person类有两个属性(name和age)。__init__()方法是类的构造方法,在创建类的实例时会自动调用。

2、类的属性

        类的属性可以分为两类:实例属性和类属性。

实例属性

        实例属性是绑定到实例上的属性,每个实例都有独立的实例属性。实例属性通常在__init__()方法中定义:

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Civic")

        在这个例子中,car1和car2是两个独立的实例,各自有独立的make和model属性。

类属性

        类属性是绑定到类本身的属性,所有实例共享一个类属性。类属性通常在类体内定义:

class Dog:
    species = "Canis lupus familiaris"

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

dog1 = Dog("Buddy")
dog2 = Dog("Max")

print(dog1.species)  # 输出:Canis lupus familiaris
print(dog2.species)  # 输出:Canis lupus familiaris

        在这个例子中,species是一个类属性,所有Dog类的实例共享这个属性。 

3. 类的方法

        类的方法是绑定到类或实例的函数。根据绑定方式的不同,类的方法可以分为实例方法、类方法和静态方法。

实例方法

        实例方法是绑定到实例上的方法,第一个参数通常命名为self(建议不更改),一般表示实例本身:

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

    def meow(self):
        print(f"{self.name} says meow.")

cat1 = Cat("Whiskers")
cat1.meow()  # 输出:Whiskers says meow.

类方法

        类方法使用@classmethod装饰器修饰,绑定到类而不是实例(但实例也可以访问它),第一个参数通常命名为cls(建议不更改),表示类本身:

class Bird:
    species = "Aves"

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

    @classmethod
    def set_species(cls, species):
        cls.species = species

bird1 = Bird("Sparrow")
Bird.set_species("NewSpecies")

print(bird1.species)  # 输出:NewSpecies

静态方法

        静态方法使用@staticmethod装饰器修饰,静态方法通常用于逻辑上属于类但不需要访问实例或类属性的方法: 

class Math:
    @staticmethod
    def add(a, b):
        return a + b

result = Math.add(5, 3)
print(result)  # 输出:8

4. 特殊情况

实例方法的非绑定调用

        上面所说的实例方法的调用是绑定式调用,即对于实例方法,使用了相应的实例调用。这并不是Python强制要求的,下面将举例说明。

​class Cat:
    def __init__(self, name):
        self.name = name

    def meow(self):
        print(f"{self.name} says meow.")

cat1 = Cat("Whiskers")
# 利用“实例名.实例方法名”的形式绑定调用,无需要手动传递实例作为参数,会自动将实例作为实例方法的第一个位置参数传入
cat1.meow()     # 输出:Whiskers says meow.

# 利用“类名.实例方法名”的形式非绑定调用,需要手动传递实例作为参数
Cat.meow(cat1)       # 输出:Whiskers says meow.
Cat.meow(self=cat1)  # 输出:Whiskers says meow.

        在进行非绑定调用时,需要手动传递实例对象,而对于绑定式调用,实例对象会自动传入并作为实例方法的第一个位置参数。

        实际上,在进行非绑定调用时,传入的甚至可以不是该类的实例,如下例所示。

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

    def meow(self):
        print(f"{self.name} says meow.")

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

    def bark(self):
        print(f"{self.name} says bark.")

    def What(self):
        print(f"This is just like an {self}")

cat1 = Cat("Whiskers")
dog1 = Dog("Fido")
Cat.meow(dog1)        # 输出:Fido says meow.
Dog.bark(cat1)        # 输出:Whiskers says bark.
Dog.What("function")  # 输出:This is just like an function

        对于上例,只要传入bark方法的实例拥有name属性,传入meow方法的实例拥有name属性,就不会报错(这是因为方法中使用了传入对象的name属性)。对于What方法,传入的参数甚至没什么要求。

        这是个不建议的行为,因为它消除了实例方法和实例之间的绑定,甚至在某种意义上,该方法都不能称为实例方法了(因为可以像调用任何普通的函数一样调用它)。

        一个好的建议是:对于所有的实例方法,都使用实例绑定式调用。

类方法的实例调用

        上面所说的类方法的调用是绑定式调用,即对于类方法,使用了相应的类调用。这并不是Python强制要求的,一个类方法可以通过类的实例调用,下面将举例说明。 

class Bird:
    species = "Aves"

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

    @classmethod
    def set_species(cls, species):
        print(cls)
        cls.species = species

bird1 = Bird("Sparrow")
bird1.set_species("NewSpecies")
print(bird1.species) # 输出:<class '__main__.Bird'> NewSpecies

        对于静态方法,在通过绑定的类调用时,会自动将类作为静态方法的第一个位置参数传递,即使该类的实例调用静态方法, 也是如此。

        一个好的建议是:对于所有的类方法,都使用相应的类进行调用。

静态方法的实例调用\访问属性

        其实静态方法只代表着,不论是使用实例还是类,对其进行调用时,不会自动传递实例或类作为参数。不论是使用“实例名.实例方法名”还是“类名.实例方法名”,都需要手动传入参数。这也代表着静态方法其实也可以访问类或实例属性(尽管这不推荐),下面将举例说明。

class Math:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    @staticmethod
    def add(a, b):
        return a + b
    
    @staticmethod
    def mul(self):
        return self.x * self.y
    
math1= Math(2, 3)
result1 = math1.add(5, 3)
print(result1)  # 输出:8

result2 = Math.mul(math1)
print(result2)  # 输出:6

result3 = math1.mul(math1)
print(result3)  # 输出:6

        上例中的静态方法可以通过类的实例调用,也可以通过在使用类调用时传递实例来访问实例属性。

        一个好的建议是:对于所有的静态方法,使用相应的类进行调用,并且不要访问任何属性和方法。

总结

        本文总结了Python中类的属性(实例属性、类属性)和方法(实例方法、类方法、静态方法)相关的知识点,并在最后给出了一些特殊情况,这并不是鼓励去使用,只是为了更加严谨,避免”类方法不能访问实例属性“或”静态方法不能访问属性“之类的绝对说辞。 

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

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

相关文章

【Docker】常见概念|技术架构演进之路|八大架构|单机架构|应用数据分离架构|应用服务集群架构

目录 一、常见概念 应用&#xff08;Application&#xff09; / 系统&#xff08;System&#xff09; 模块&#xff08;Module&#xff09; / 组件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff09; 集群&#xff08;Cluster&#xff09; 主…

python调用MATLAB函数的一个诡异的问题,数据类型问题

记一次python调用MATLAB函数的诡异问题 说明&#xff08;废话&#xff09;解决方案总结 说明&#xff08;废话&#xff09; 这个问题的起因是python调用MATLAB函数的问题&#xff0c;归根结底&#xff0c;主要还是因为不同语言对于不同的数据表达的方式不同造成的问题。 pytho…

在Postman中引用JS库

前言 在做接口测试时&#xff0c;出于安全因素&#xff0c;请求参数需要做加密或者加上签名才能正常请求&#xff0c;例如&#xff1a;根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的&#xff0c;即在请求前使用JavaScript脚本对…

界面组件DevExtreme v24.2将发布一系列新组件、支持.NET 9

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

中小企业选择数字工厂管理系统需要注意哪些问题

在当今数字化转型的大潮中&#xff0c;中小企业作为经济体系的重要组成部分&#xff0c;正积极寻求通过引入数字工厂管理系统来提升生产效率、优化资源配置、增强市场竞争力。然而&#xff0c;面对市场上琳琅满目的数字工厂管理系统解决方案&#xff0c;中小企业在选择时往往面…

HarmonyOS鸿蒙- 延时执行

一、延时执行一次 3000 表示秒,可根据需求修改 //2秒后执行打印setTimeout(() > {console.log(Timer is end)},3000) 取消延时执行 // 3秒后执行打印 let timerId setTimeout(() > {console.log(Timer is end)},3000)// 取消timerId的延时 clearTimeout(timerId) 二、…

设计师的素材管理神器,eagle、千鹿大测评

前言 专业的设计师都会精心维护自己的个人素材库&#xff0c;常常需要耗费大量时间用于浏览采集、分类标注、预览筛选、分享协作&#xff0c;还要管理字体、图片、音视频等各类设计素材 如果你作为设计师的话&#xff0c;今天&#xff0c;就为大家带来两款热门的素材管理工具…

构建基于数据驱动的应用程序与Llamaindex——理解大型语言模型

如果你在阅读这本书&#xff0c;你可能已经探索过大型语言模型&#xff08;LLMs&#xff09;的领域&#xff0c;并且已经认识到它们的潜在应用以及它们的缺陷。本书旨在解决LLMs所面临的挑战&#xff0c;并提供一本实用指南&#xff0c;教你如何使用LlamaIndex构建数据驱动的LL…

57_Redis与Springboot的集合应用

前提 要实现,使用Redis存储登录状态 需要一个完整的前端后端的项目 前端项目搭建 解压脚手架安装依赖配置请求代理选做: 禁用EsLint语法检查 Vue Admin Template关闭eslint校验&#xff0c;lintOnSave&#xff1a;false设置无效解决办法_lintonsave: false-CSDN博客 后端项…

C++和R穿刺针吸活检肿瘤算法模型模拟和进化动力学量化差异模型

&#x1f3af;要点 &#x1f3af;模拟肿瘤细胞增生进化轨迹 | &#x1f3af;肿瘤生长的随机空间细胞自动机模型 | &#x1f3af;模拟穿刺活检的收集空间局部的肿瘤块&#xff0c;模拟针吸活检采集长而薄的组织样本 | &#x1f3af;构建不同参数模拟合成肿瘤测试集 | &#x1f…

【TS】TypeScript函数类型:提升函数的类型安全性和可读性

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript函数类型&#xff1a;提升函数的类型安全性和可读性1. 引言2. 基本函…

vue3 基于elementui el-table封装 hooks (未使用ts版本)

elementui-table封装 hooks js-hooks import { ref, reactive, onMounted } from vue import { ElMessage, ElMessageBox, ElNotification } from element-plus /*** FileDescription: el-table 函数式组件hooks--实现一个表格的数据加载、分页、搜索、删除和导出等操作,* fu…

tesseract 图片识别引擎

什么是tesseract Tesseract是一款开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;用于从图像中提取文本。它由Ray Smith在惠普实验室于1985年至1995年开发&#xff0c;并在2005年由惠普将其作为开源软件发布。之后&#xff0c;Tesseract的开发由Google主导&am…

如何理解低代码?怎么用好低代码

怎样理解低代码 理解一个概念最好的办法就是找相关概念进行类比&#xff0c;那么想要单独理解低代码这个概念是不太行的。我们还需要了解“零代码”以及“纯代码”开发的概念。那么什么是低代码&#xff1f;其与“零代码”和“纯代码”的关系又是如何&#xff1f; 零代码 也许…

IDEA资源文件中文乱码问题解决方法

目录 一、问题描述二、解决方法 一、问题描述 IDEA中打开资源文件出现乱码。 二、解决方法 进入“Settings” -> “Editor” -> “File Encodings”&#xff0c;按下图修改箭头所指的三个地方&#xff1a;

java类加载和双亲委派及加载恶意类代码应用

前面的CC1和CC6&#xff0c;都是在Runtime.exec执行命令。如果WAF过滤了Runtime就寄&#xff0c;而且用命令的方式写入shell进行下一步利用&#xff0c;在流量中一个数据包就能把你的行为全部看完&#xff0c;很容易被分析出来。 如果用恶意字节码加载的方式&#xff0c;我们的…

轮询系统的具体原理是什么

一般市面上的轮询系统&#xff0c;看似高深莫测&#xff0c;但都是大差不差的&#xff0c;没有太多的技术含量&#xff0c;都是通过你的订单情况&#xff0c;在数据库中找出一个可以收这个订单的支付方式&#xff0c;然后经过b站来实现与支付通道商交互。 这个过程看似复杂&am…

IP-GUARD文档云备份服务器迁移数据操作说明

一、功能简介 使用文档云备份过程可能出现需要迁移旧数据到新目录的情况(如一开始存储目录设置 不合理,之后变更存储目录),下面介绍迁移备份数据到新目录的方法,迁移后可正常查看、 下载、删除原备份文件。 二、同一计算机上迁移存储目录 当仅需要将存储目录迁移到同一计…

随机森林的可解释性分析(含python代码)

随机森林的可解释性分析 1.引言可解释性的重要性 2.随机森林的原理2.1 基本原理&#xff1a;2.2 随机森林的实现 3.随机森林的可解释性分析3.1 特征重要性3.2 特征重要性3.3 SHAP值3.4 部分依赖图&#xff08;PDP&#xff09;3.5 交互特征效应3.6 变量依赖图 4.结论5.参考文献 …

Android和iOS 测试五个最好的开源自动化工具

本文主要介绍Android和iOS 五个最好的开源自动化工具&#xff0c;这里整理了相关资料&#xff0c;希望能帮助测试软件的朋友&#xff0c;有需要的看下 自动化测试在产品测试上有着非常重要的作用。实现测试自动化有多种积极的方式&#xff0c;包括最大限度地减少测试执行时间&…