Python类的成员介绍

news2024/11/26 2:30:57

Python类的成员介绍

在Python中,类(class)是一种定义对象的模板。对象是由类创建的实例,它们具有属性和方法。属性是对象的变量,而方法是对象的函数。

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

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

Python类的成员概述

Python类(class)由以下主要成员组成:

属性(Attributes):属性用于存储类和实例的状态。在Python中,有两种类型的属性,分别是类属性和实例属性。

类属性:类属性属于类本身,可以被类及其所有实例共享。类属性定义在类的内部,但位于方法之外。
实例属性:实例属性属于类的各个实例,每个实例拥有独立的实例属性。实例属性通常在__init__方法或其他实例方法中使用self.attribute_name的形式进行定义。
方法(Methods):方法是类的操作、功能或行为。方法可以分为实例方法、类方法和静态方法。@classmethod和@staticmethod是两个内置装饰器,它们分别用于将函数转换为类方法和静态方法。


Attributes(属性):这是指类或实例内部定义的变量。它们可以分为类属性和实例属性。
类属性是在类内部定义的,所有实例共享相同的值。例如:
class Person:
    # 类属性
    species = 'human'

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


在Python中,类里的方法可以分为三种类型:实例方法、类方法和静态方法。它们的定义和使用方式如下:
实例方法:实例方法是指在类中定义的普通方法,第一个参数必须是self,用于表示实例本身。调用实例方法时,Python会自动将调用该方法的实例对象作为参数传递。只有实例对象才能调用实例方法。
class MyClass:
    def instance_method(self):
        print("This is an instance method.")

my_instance = MyClass()
my_instance.instance_method()

类方法:类方法是由装饰器@classmethod修饰的方法。第一个参数必须是cls,用于表示类本身。类方法可以被类对象和实例对象调用。调用类方法时,Python会自动将调用该方法的类作为参数传递。
class MyClass:
    @classmethod
    def class_method(cls):
        print("This is a class method.")
        
MyClass.class_method()
my_instance = MyClass()
my_instance.class_method()

静态方法:静态方法是由装饰器@staticmethod修饰的方法。静态方法没有特殊的第一个参数(无需传入self或cls),因此既不依赖于类,也不依赖于实例。静态方法可以被类对象和实例对象调用。
    @staticmethod
    def static_method():
        print("This is a static method.")
        
MyClass.static_method()
my_instance = MyClass()
my_instance.static_method()

这三种方法在使用场景和功能上有所不同,可以根据需要在类中合理地选择使用。

魔法方法(Magic methods):魔法方法是Python中以双下划线__开头和结尾的特殊方法。这些方法通常不需要显式调用,而是在某些操作发生时自动调用。魔法方法(Magic methods)被称为类的成员,是因为它们实际上就是定义在类中的特殊方法。与普通方法(如实例方法、类方法和静态方法)一样,魔法方法也是类的一部分,并可以用于控制类的行为和操作。如初始化方法(Initialization method):__init__(self, ...):是魔法方法(Magic methods)之一,当创建类的实例时自动调用。通常用于初始化实例属性。在创建类的对象时自动调用。它通常用于初始化实例属性和执行类对象创建时的一些操作。

Property(特性):这是使用 @property 装饰器将类方法转化为特殊类型属性的功能。这允许您使用getter和setter方法来控制对属性的访问和修改——增加逻辑控制和保护,以便在获取或设置属性时执行某些操作。
以下是一个使用 @property 的示例:
class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        print("Getting radius")
        return self._radius

    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError("Radius cannot be negative")
        print("Setting radius")
        self._radius = value

    @property
    def area(self):
        return 3.14159 * self._radius ** 2
在这个例子中,radius 是一个属性,它有一个getter方法(使用 @property 装饰的方法)和一个setter方法(使用 @radius.setter 装饰的方法)。通过这种方式,你可以获得或设置 radius 的值,并在这些操作期间执行一些额外的操作。
area 属性仅具有getter方法,没有setter方法。这意味着它是一个只读属性。

在Python中,属性(attributes)和属性(property)是两个有关类的概念,它们之间有一定的区别。

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

类属性

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

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

#类属性示例
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.变量名定义的变量。实例属性:属于类的实例,只能通过实例名来访问。对于每个实例来说,实例属性的值是不同的,且在不同实例中是不共享的。下面给出一个示例源码:

#实例属性
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,表示类本身,可以使用类名或者实例名来调用,类方法可以访问和修改类属性,但不能访问实例属性。下面给出一个示例源码:

#类方法示例
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参数。

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

#静态方法示例
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,表示调用该方法的实例。只能使用实例名来调用。下面给出一个示例源码:

#实例方法示例
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。只能使用实例名来调用实例方法。

property

在Python中,property是一种特殊的属性,是一种特殊的装饰器,也是Python中的一个内置函数。

property是一种特殊的属性,指的是对一个对象的属性进行封装和控制,使其能够像访问常规属性一样被访问,但是在实现时增加了一些额外的逻辑,比如访问权限、类型检查、计算等。
property是一种特殊的装饰器,它可以将一个方法转换为属性,从而实现更精细的控制和访问。在使用property时,通常需要结合getter、setter和deleter三个装饰器来完成属性的定义和封装。
property也是Python中的一个内置函数,用于创建一个属性。在定义一个property属性时,我们需要提供访问该属性的getter、setter和deleter方法,并使用@property、@xxx.setter和@xxx.deleter等装饰器将其转换为属性。
因此,property既是一种特殊的属性,又是一种特殊的装饰器,同时也是Python中的一个内置函数,其作用是对一个对象的属性进行封装和控制,可以使代码更加简洁、可读和易于维护,同时提供了精细的属性控制和访问方式。

关于Python中property,可参见 https://blog.csdn.net/cnds123/article/details/129420059

魔术方法/特殊方法

Python中的特殊方法(Special methods)和魔术方法(Magic methods)是同一个概念,指的是一类以双下划线(__)开头和结尾的特殊方法。关于python魔术方法,可参见https://blog.csdn.net/cnds123/article/details/116600746

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

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

相关文章

DragGAN:interactive point-based manipulation on the generative image manifold

AI绘画可控性研究与应用清华美院课程的文字稿和PPThttps://mp.weixin.qq.com/s?__bizMzIxOTczNjQ2OQ&mid2247484794&idx1&sn3556e5c467512953596237d71326be6e&chksm97d7f580a0a07c968dedb02d0ca46a384643e38b51b871c7a4f89b38a04fb2056e084167be05&scene…

基于html+css的图展示97

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

测量平差实习心得精选三篇(合集)

测量平差实习心得精选三篇 测量平差实习心得一为期两周的实习在不断地学习、尝试、修正的过程中圆满结束了。这次实习让我对许多问题有了深刻的认识。我认识到编程的重要性&#xff0c;认识到自学能力的重要性&#xff0c;认识到从书本到实践还有很长一段路要走。 熟练掌握一门…

探索C++非质变算法:如何更高效地处理数据

前言 &#x1f4d6;欢迎大家来到小K的c专栏&#xff0c;本节将为大家带来C非质变算法的详解 &#x1f389;欢迎各位→点赞&#x1f44f; 收藏&#x1f49e; 留言&#x1f514;​ &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指…

随机数发生器设计(二)

一、软件随机数发生器组成概述 密码产品应至少包含一个随机比特生成器。 软件随机数发生器应遵循GM/T 0105-2021《软件随机数发生器设计指南》要求&#xff0c;使用SM3或SM4算法作为生成随机比特算法。 本文以SM3算法为例描述软件随机数发生器的一个设计实例。需要注意的是&a…

如何在华为OD机试中获得满分?Java实现【猜字谜】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

python爬虫——pandas的简单使用

pandas作为爬虫中最重要的包之一&#xff0c;我们要想学好爬虫&#xff0c;就必须要深入了解pandas 直接上代码 import pandas as pd import numpy as npdata pd.DataFrame(np.arange(16).reshape((4,4)),index[a,b,c,d],#如果不写列索引默认为0&#xff0c;1&#xff0c;…

基于html+css的图展示96

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【源码解析】Nacos配置热更新的实现原理

使用入门 使用RefreshScopeValue&#xff0c;实现动态刷新 RestController RefreshScope public class TestController {Value("${cls.name}")private String clsName;}使用ConfigurationProperties&#xff0c;通过Autowired注入使用 Data ConfigurationProperti…

警惕AI换脸技术:近期诈骗事件揭示的惊人真相

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 目录 1. deepswap 2. faceswap 3. swapface 总结 &#x1f4e3;通知 近日&#xff0c;包头警方公布了一起用AI进行电信诈骗的案件&#xff0c;其中福州科技公…

医院PACS系统:三维多平面重建操作使用

三维多平面重建&#xff08;MPR\CPR&#xff09;界面工具栏&#xff1a; 按钮1&#xff1a;点击此按钮&#xff0c;用鼠标拖动正交的MPR定位线&#xff0c;可以动态浏览MPR图像。 按钮2&#xff1a;点击此按钮&#xff0c;按下鼠标左键在图像上作任意勾边&#xff0c;弹起鼠标…

python3.8安装rpy2

python3.8安装rpy2 rpy2是一个可以让r和python交互的库&#xff0c;非常强大&#xff0c;但是安装过程有些坎坷。 安装r语言 安装时首先需要安装r语言。 官网下载链接&#xff1a;https://www.r-project.org/ 选择与自己电脑相应的版本就好。 安装rpy2 然后需要安装rpy2库…

Radxa ROCK 5A RK3588S 开箱 vs 树莓派

Rock5 Model A 是一款高性能的单板计算机&#xff0c;采用了 RK3588S (8nm LP 制程&#xff09;处理器&#xff0c;具有 4 个高达 2.4GHz 的 ARM Cortex-A76 CPU 核心、4 个高达 1.8GHz 的 Cortex-A55 内核和 Mali-G610 MP4 GPU&#xff0c;支持 8K 60fps 视频播放&#xff0c…

光力转债上市价格预测

光力转债 基本信息 转债名称&#xff1a;光力转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;4.0亿元。 正股名称&#xff1a;光力科技&#xff0c;今日收盘价&#xff1a;22.53元&#xff0c;转股价格&#xff1a;21.46元。 当前转股价值 转债面值 / 转股…

Redis的常用数据结构之字符串类型

redis中的数据结构是根据value的值来进行区别的&#xff0c;主要分了String、Hash、List、Set&#xff08;无序集合&#xff09;、Zset&#xff08;有序集合&#xff09; 字符串&#xff08;String&#xff09; String类型是redis中最基础的数据结构&#xff0c;也可以理解为…

Java基础面试题突击系列6

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

一、CNNs网络架构-基础网络架构(LeNet、AlexNet、ZFNet)

目录 1.LeNet 2.AlexNet 2.1 激活函数&#xff1a;ReLU 2.2 随机失活&#xff1a;Droupout 2.3 数据扩充&#xff1a;Data augmentation 2.4 局部响应归一化&#xff1a;LRN 2.5 多GPU训练 2.6 论文 3.ZFNet 3.1 网络架构 3.2 反卷积 3.3 卷积可视化 3.4 ZFNet改…

Integer源码

介绍 Integer是int类型的包装类&#xff0c;继承自Number抽象类&#xff0c;实现了Comparable接口。提供了一些处理int类型的方法&#xff0c;比如int到String类型的转换方法或String类型到int类型的转换方法&#xff0c;当然也包含与其他类型之间的转换方法。 Comparable提供…

3ds MAX 基本体建模,长方体、圆柱体和球体

3ds MAX基本页面如下&#xff1a; 生成新的几何体在右侧&#xff1a; 选择生成的对象类型即可&#xff0c;以下为例子&#xff1a; 1、长方体建模 选择建立的对象类型为长方形 在 任意一个窗口绘制&#xff0c;鼠标滑动 这里选择左上角的俯视图 松开鼠标后&#xff0c;可以…

单片机GD32F303RCT6 (Macos环境)开发 (二十九)—— GD32通过蓝牙透传模块 IAP升级

GD32通过蓝牙透传模块 IAP升级 1、思路 上一节手机App可以通过HC-08模块控制mcu的开锁&#xff0c;关锁的动作&#xff0c;那么我们是不是可以将mcu的升级文件通过hc-08模块发送给gd32&#xff0c;完成gd32程序的自升级呢&#xff1f; 2、命令协议 蓝牙透传模块每次只能发2…