Python类的属性和方法介绍

news/2024/7/23 23:48:22 标签: python

Python类的属性和方法介绍

本文主要讲python类属性(类变量)、实例属性(实例变量);类方法、静态方法、实例方法。

【定义在类中的变量也称为属性,定义在类中的函数也称为方法。】

这些都是Python面向对象程序设计需要熟知的,关于Python面向对象程序设计基本知识可见https://blog.csdn.net/cnds123/article/details/108354860

类属性

类属性(类变量):定义在类中,并且在方法外的变量。属于类本身而不是类的实例。可以使用类名或者实例名来访问。对于所有的实例来说,类属性的值是相同的,且在类的所有实例中是共享的。

下面给出一个例子,这个例子中定义了一个Professor(教授)类,使用类名或者实例名来访问类属性department(系、部门),代码如下:

python">#类属性示例
class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 访问类属性
print(Professor.department)  # "Computer Science"

# 创建教授对象
prof = Professor("John Smith", 40)
# 访问类属性
print(prof.department)  # "Computer Science"

运行测试:

在上面的代码中,我们使用类名或者实例名来访问类属性department,两种方式都可以得到相同的结果,即"Computer Science"。

实例属性

实例属性(实例变量):在类中方法内通过self.变量名定义的变量。实例属性:属于类的实例,只能通过实例名来访问。对于每个实例来说,实例属性的值是不同的,且在不同实例中是不共享的。下面给出一个示例源码:

python">#实例属性
class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建教授对象
prof1 = Professor("John Smith", 40)
prof2 = Professor("Mary Brown", 35)

# 访问实例属性
print(prof1.name)  # "John Smith"
print(prof2.name)  # "Mary Brown"

运行测试:

在上面的代码中,我们创建了两个不同的教授对象prof1和prof2,分别将它们的name属性设置为John Smith和Mary Brown。通过实例名来访问实例属性。

  

下面介绍类中方法。类中方法可以划分为实例方法(普通方法)、类方法和静态方法。

类方法前用@classmethod修饰

静态方法前用@staticmethod修饰

不加任何修饰的就是实例方法(普通方法)

【@classmethod 和 @staticmethod 都是函数装饰器】

类方法

类方法与类本身相关的方法,使用@classmethod装饰器来定义。类方法的第一个参数通常为cls,表示类本身,可以使用类名或者实例名来调用,类方法可以访问和修改类属性,但不能访问实例属性。下面给出一个示例源码:

python">#类方法示例
class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age


    # 类方法
    @classmethod
    def change_department(cls, new_dept):
        cls.department = new_dept

# 访问类属性
print(Professor.department)  # "Computer Science"
prof1 = Professor("John Smith", 40)
prof2 = Professor("Jane Doe", 35)
#调用类方法来修改类属性
Professor.change_department("Mathematics")

print(prof1.department)  # Mathematics
print(prof2.department)  # Mathematics

运行测试:

在上面的代码中,我们使用类名调用了change_department类方法,将department类属性的值从"Computer Science"修改为"Mathematics"。可以发现,这个修改是在所有的实例中都生效的。

静态方法

静态方法(staticmethod)与类和实例都没有直接的关联,它们只是存在于类的命名空间中。静态方法是使用@staticmethod装饰器来定义的,它没有默认的参数,也不需要使用cls或self参数。静态方法主要用于与类相关的工具函数,它们没有默认的参数,也不需要使用cls或self参数。在使用时,我们可以使用类名或实例名来调用静态方法,而不需要创建实例对象。静态方法可以访问类属性,但不能访问实例属性,因为它们没有cls或self参数。

静态方法可以使用类名或实例名来调用,两者的效果是一样的。在某些情况下,使用实例名调用静态方法可能更加直观和易于理解。下面给出一个示例源码:

python">#静态方法示例
class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age, salary):
        self.name = name
        self.age = age
        self.salary = salary

    @staticmethod
    def calculate_salary(salary):
        # 计算教授的工资
        tax_rate = 0.2  # 税率为20%
        tax = salary * tax_rate
        return salary - tax

# 使用类名调用静态方法
salary = Professor.calculate_salary(100000)
print(f"The actual salary is {salary}.")

# 使用实例名调用静态方法
# 创建一个教授实例
professor = Professor("John Smith", 50, 120000)
salary = professor.calculate_salary(120000)
print(f"The actual salary is {salary}.")

运行测试:

在上面的代码中,使用Professor.calculate_salary(100000)来调用静态方法,计算工资为100000的教授的实际工资。接着,创建了一个教授实例professor,然后使用professor.calculate_salary(120000)来调用静态方法,计算该教授的实际工资。由于静态方法不依赖于类的实例,因此我们可以使用实例名或类名来调用该方法,都是允许的。

实例方法

实例方法与类的实例相关的方法,使用类中的方法来定义,第一个参数通常为self,表示调用该方法的实例。只能使用实例名来调用。下面给出一个示例源码:

python">#实例方法示例
class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def retire(self):
        print(f"{self.name} is retiring.")
        self.age = 65

# 创建教授对象
prof = Professor("John Smith", 40)

# 调用实例方法
prof.retire()  # "John Smith is retiring."
print(prof.age)  # 65

运行测试:

在上面的代码中,我们调用了retire实例方法,将prof对象的age属性从40修改为65。只能使用实例名来调用实例方法。


http://www.niftyadmin.cn/n/365663.html

相关文章

SpringBoot实践(四十二):常用的PostProcessor后置处理器与Aware接口

在BeanFactory的创建过程中有很多对外提供的扩展点,就是xxxPostProcessor接口和各种xxxAware接口了,在真实生产中用处极大,可以让我们自定义某些beanDefinition或者某个Bean的属性,或者我们直接拿到SpringContext容器实例化后的对…

Less基础速学 —— 嵌套、变量、注释、

关于CSS的预处理有读者了解到的就有主流的这三种:less 、sass/sacc 和 stylus,那么在使用这些CSS的预处理器,有浏览器的用法和服务器端的方法,例如使用Node来通过NPM包管理工具下载安装less在服务端来跑,那么在浏览器上…

python 背包问题:0-1背包,多重背包,数据结构,超详细模板套用和解读;数组组合问题

一、0-1背包问题: 题目:有n个物品,第i个体积为w[i],价值为v[i],每个物品最多选一个,求体积和不超过capacity时能装物品的最大价值 转移方程: dfs(i,c) max(dfs(i-1,c),dfs(i-1,c-w[i])v[i])…

【数据结构】---几分钟简单几步学会手撕链式二叉树(中)

文章目录 前言🌟一、二叉树链式结构的实现🌏1.1 二叉树叶子节点个数💫代码:💫流程图: 🌏1.2 二叉树的高度💫第一种写法(不支持):📒代码:&#x1f…

Java学习路线(14)——Map集合类

一、介绍 概念 Map集合是一种双列集合,每个元素包含两个数据。元素格式:【keyvalue】键值对元素Map又称为 “键值对集合” Map集合格式: {key1value1,key2value2,key3value3,…} 二、Map集合的特点 Map家族图 1、说明: 使用…

vue项目实践-添加axios封装api请求

安装 axios npm install axios --save 创建实例 (utils/fetch.js) axios 默认提交格式为:application/json 可使用 qs 模块(需要安装)转换后提交格式为 application/x-www-form-urlencoded 通过设置 transformRequest 属性 data > qs.stringify(data) 可以正常…

打包和优化

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

JavaScript 验证 API

JavaScript提供了多种验证API,用于验证用户输入的数据或者执行其他类型的验证操作。以下是一些常用的JavaScript验证API: 1. **正则表达式(Regular Expressions)**:正则表达式是一种强大的验证工具,用于匹…