当前位置: 首页 > news >正文

Python @staticmethod、super().__init__()和self

最近在看代码,由于之前没有系统学习过Python,就有些知识点不是很清楚,这里整理一下,方便以后查阅。

Python中的@staticmethod\super.init和self

  • Python 装饰器
  • @staticmethod和@classmethod的作用与区别
    • 作用
    • 区别
    • 代码演示
  • super() 函数
  • super().__init__()函数
    • super().__init__()基本用法
    • super().__init__() 和 super(Child, self).__init__() 的区别
      • 参数传递方式:
      • 多继承中的 super().__init__()
      • 多继承中的 super(Child, self).__init__()
  • self 代表类的实例,而非类
  • 参考资料

Python 装饰器

装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。

装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。

装饰器的语法使用 @decorator_name 来应用在函数或方法上。

Python 还提供了一些内置的装饰器,比如 @staticmethod@classmethod,用于定义静态方法和类方法。

装饰器的应用场景:

  1. 日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。
  2. 性能分析: 可以使用装饰器来测量函数的执行时间。
  3. 权限控制: 装饰器可用于限制对某些函数的访问权限。
  4. 缓存: 装饰器可用于实现函数结果的缓存,以提高性能。

使用装饰器

装饰器通过 @ 符号应用在函数定义之前,例如:

@time_logger
def target_function():pass

等同于:

def target_function():pass
target_function = time_logger(target_function)

这会将 target_function 函数传递给 decorator 装饰器,并将返回的函数重新赋值给 target_function。从而,每次调用 target_function 时,实际上是调用了经过装饰器处理后的函数。

通过装饰器,开发者可以在保持代码整洁的同时,灵活且高效地扩展程序的功能。

@staticmethod和@classmethod的作用与区别

作用

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。但是使用@staticmethod或@classmethod,就可以不需要实例化。

所以@staticmethod或@classmethod作用:使用@staticmethod或@classmethod,就可以不需要实例化,直接“类名.方法名()”来调用。这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

区别

  1. @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
  2. @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
    类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
    对于类方法,可以通过类来调用,就像Test.foo(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像Test().foo(),这里Test(),写成这样之后它就是类的一个实例了。
  3. 静态方法它基本上跟一个全局函数相同,一般来说用的很少。
  4. 在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
    而@classmethod因为持有cls参数(当然,也可以用“self” 代替,个人认为是为了和类的self区分才用cls的),可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

代码演示

class A(object):bar = 1def foo(self):print('foo')@staticmethoddef static_foo():print('static_foo')print(A.bar)@classmethoddef class_foo(cls):print('class_foo')print(cls.bar)cls().foo()A.static_foo()
A.class_foo()'''输出结果
static_foo
1
class_foo
1
foo
'''

super() 函数

super() 函数是用于调用父类(超类)的一个方法。

super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

super().init()函数

super().__init__() 是用于在 Python 中调用父类(也称为超类或基类)的构造方法(init 方法)的一种方式。这通常在子类的构造方法中使用,以便在添加子类特有的功能之前,初始化父类中定义的属性和执行其他必要的设置。

super()用来调用父类(基类)的方法,init()是类的构造方法,
super().__init__() 就是调用父类的__init__()方法, 同样可以使用super()去调用父类的其他方法。

super().init()基本用法

以下是一个基本示例,展示了如何在子类的构造方法中使用 super().init():

class Parent:def __init__(self, name):self.name = nameclass Child(Parent):def __init__(self, name, age):super().__init__(name)  # 调用父类的构造方法以初始化 nameself.age = age #添加自定义age属性child = Child("Alice", 25)
print(child.name)  # 输出 "Alice"
print(child.age)   # 输出 25

super().init() 和 super(Child, self).init() 的区别

super().init() 和 super(Child, self).init() 都是用于调用父类的构造方法,但它们之间有一个重要的区别:

参数传递方式:

  • super().__init__(): 这种方式不需要显式传递当前类和实例(self)作为参数,Python会自动识别当前类和实例。这是一种简化的写法,通常用于单继承的情况。

  • super(Child, self).__init__(): 这种方式明确指定了当前类(Child)和实例(self)作为参数传递给 super()。这种方式通常在多继承的情况下使用,以明确指定要调用哪个父类的构造方法。

多继承中的 super().init()

如果类是多继承的,使用 super(Child, self).init() 可以更明确地控制调用的是哪个父类的构造方法,因为 super() 可以基于参数中的当前类(Child)找到正确的父类。

下面是一个多继承的示例,演示了使用super().init() 和 super(Child, self).init() 的区别:

class Parent1:def __init__(self):print("Parent1 constructor")class Parent2:def __init__(self):print("Parent2 constructor")class Parent3:def __init__(self):print("Parent3 constructor")class Child(Parent1,Parent2,Parent3):    # 顺序为Parent1,Parent2,Parent3def __init__(self):super().__init__()               # 使用简化写法,调用了 Parent1 的构造方法child = Child()
#输出结果:Parent1 constructor

接下来将Child继承父类中Parent1,Parent2的顺序进行调换,运行结果如下:

#把Parent1,Parent2的顺序进行调换
class Parent1:def __init__(self):print("Parent1 constructor")class Parent2:def __init__(self):print("Parent2 constructor")class Parent3:def __init__(self):print("Parent3 constructor")class Child(Parent2,Parent1,Parent3):    # 顺序为Parent2,Parent1,Parent3def __init__(self):super().__init__()               # 使用简化写法,调用了 Parent2 的构造方法child = Child()
#输出结果:
#Parent2 constructor

在上面的示例中,我们可以知道,在多继承的情况下,super().init() 调用的是子类(Child)继承父类中,第一个父类的构造方法。

多继承中的 super(Child, self).init()

class Parent1:def __init__(self):print("Parent1 constructor")class Parent2:def __init__(self):print("Parent2 constructor")class Parent3:def __init__(self):print("Parent3 constructor")class Child(Parent1, Parent2,Parent3):def __init__(self):super(Child, self).__init__()     # 调用Child下一个父类的构造方法,即Parent1super(Parent2, self).__init__()   # 调用Parent2下一个父类的构造方法,即Parent3child = Child()
#输出结果:
#Parent1 constructor
#Parent3 constructor

综上,我们可以知道,在多继承中,super().init() 继承的是子类继承的第一个父类,super(Parent2, self).init() 继承的是声明类的下一个父类

self 代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

class Test:def prt(self):print(self)print(self.__class__)t = Test()
t.prt()

以上实例执行结果为:

<__main__.Test instance at 0x100771878>
__main__.Test

从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

class Test:def prt(runoob):print(runoob)print(runoob.__class__)t = Test()
t.prt()

以上实例执行结果为:

<__main__.Test instance at 0x100771878>
__main__.Test

在 Python中,self 是一个惯用的名称,用于表示类的实例(对象)自身。它是一个指向实例的引用,使得类的方法能够访问和操作实例的属性。

当你定义一个类,并在类中定义方法时,第一个参数通常被命名为 self,尽管你可以使用其他名称,但强烈建议使用 self,以保持代码的一致性和可读性。

class MyClass:def __init__(self, value):self.value = valuedef display_value(self):print(self.value)# 创建一个类的实例
obj = MyClass(42) # 调用实例的方法
obj.display_value() # 输出 42

参考资料

Python方法:@staticmethod和@classmethod

Python 装饰器

super().init()函数

Python super 详解

Python super() 函数

Python3 面向对象

相关文章:

Python @staticmethod、super().__init__()和self

最近在看代码&#xff0c;由于之前没有系统学习过Python&#xff0c;就有些知识点不是很清楚&#xff0c;这里整理一下&#xff0c;方便以后查阅。 Python中的staticmethod\super.init和self Python 装饰器staticmethod和classmethod的作用与区别作用区别代码演示 super() 函数…...

Linux网络:应用层协议HTTP(一)

一、什么是HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&…...

Tomcat底层原理

Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;用于运行Java Web应用。它是由Apache软件基金会开发和维护的。以下是对Tomcat底层原理的详细解析&#xff1a; 1. 启动流程 Tomcat的启动流程主要分为以下几个…...

【Linux】Linux环境设置环境变量操作步骤

Linux环境设置环境变量操作步骤 在一些开发过程中本地调试经常需要依赖环境变量的参数&#xff0c;但是怎么设置对小白来说有点困难&#xff0c;今天就介绍下具体的操作步骤&#xff0c;跟着实战去学习&#xff0c;更好的检验自己的技术水平&#xff0c;做技术还是那句话&…...

C语言:键盘录入案例

主要使用了scanf&#xff1b; scanf的使用方法和注意事项&#xff1a; 1.作用&#xff1a; 用于接收键盘输入的数据并赋值给对应的变量 2.使用方式; scanf("占位符",&变量名); 3.注意事项; 占位符后面的的变量要对应 第一个参数中不写换行 案例1&#xf…...

Nginx 中如何实现请求的排队机制?

Nginx 中如何实现请求的排队机制&#xff1f; 在当今数字化的时代&#xff0c;网站和应用的流量就如同潮水一般&#xff0c;时涨时落&#xff0c;时急时缓。想象一下&#xff0c;当流量如洪水猛兽般汹涌而来&#xff0c;服务器就像是那抗洪的堤坝&#xff0c;如果没有有效的管…...

synergy配置

今天介绍一个电脑同步软件synergy。 我们开发时一般会用两套设备&#xff0c;如果使用两套键盘操作起来会很麻烦&#xff0c;这个软件就是解决这个问题&#xff0c;可以使用一套键盘同时操作两台电脑&#xff0c;另一台作为客户端被控制。 安装 在两台电脑上各自下载安装syne…...

Qt开发网络嗅探器03

数据包分析 想要知道如何解析IP数据包&#xff0c;就要知道不同的IP数据包的包头结构&#xff0c;于是我们上⽹查查资料&#xff1a; 以太网数据包 ARP数据包 IPv4 IPv6 TCP UDP ICMP ICMPv6 根据以上数据包头结构&#xff0c;我们就有了我们的protocol.h文件&#xff0c;声明…...

抖音短视频seo矩阵系统源码开发技术分享(二)--SaaS开源

目录 市场背景分析 一、抖音短视频seo矩阵系统开发部署流程 二、 源码开发功能构思 三、 抖音短视频seo源码开发部署注意事项 四、 部分开发代码展示 市场背景分析 抖音短视频seo矩阵系统是通过不同平台不同账号之间建立联系&#xff0c;通过将同一品牌下不同平台不同账号…...

git-常用基础指令

一、基本指令 1. 配置用户名和邮箱 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"2. 初始化仓库 git init3. 克隆仓库 git clone <repository_url>4. 查看当前状态 git status5. 添加文件…...

Inconsistent Query Results Based on Output Fields Selection in Milvus Dashboard

题意&#xff1a;在Milvus仪表盘中基于输出字段选择的不一致查询结果 问题背景&#xff1a; Im experiencing an issue with the Milvus dashboard where the search results change based on the selected output fields. Im working on a RAG project using text data conv…...

视觉巡线小车——STM32+OpenMV

系列文章目录 第一章&#xff1a;视觉巡线小车——STM32OpenMV&#xff08;一&#xff09; 第二章&#xff1a;视觉巡线小车——STM32OpenMV&#xff08;二&#xff09; 第三章&#xff1a;视觉巡线小车——STM32OpenMV&#xff08;三&#xff09; 第四章&#xff1a;视觉巡…...

升级TrinityCore 服务器硬件

升级服务器 原服务器架构&#xff1a;Ubuntu装VirtualBox装Ubuntu虚拟机 原配置&#xff1a; 宿主机 内存4G 内核4 usb外接硬盘 Ubuntu虚拟机 内存1756MB 内核4 ip 192.168.0.12 升级服务器架构&#xff1a;FreeBSD装bhyve装Ubuntu虚拟机 新配置&#xff1a;宿主机 内存…...

NVidia 的 gpu 开源 Linux Kernel Module Driver 编译 安装 使用

见面礼&#xff0c;动态查看gpu使用情况&#xff0c;每隔2秒钟自动执行一次 nvidia-smi $ watch -n 2 nvidia-smi 1&#xff0c;找一台nv kmd列表中支持的 GPU 的电脑&#xff0c;安装ubuntu22.04 列表见 github of the kmd source code。 因为 cuda sdk 12.3支持最高到 ubu…...

win7显卡驱动更新后msvcp140.dll丢失的解决方法

msvcp140.dll是一个 DLL&#xff08;动态链接库&#xff09;文件&#xff0c;它是 Microsoft Visual C 2015 Redistributable Package 的一部分。这个文件包含 C 应用程序在运行时所需的标准库函数&#xff0c;主要涉及执行与 C 编程语言相关的操作&#xff0c;如内存管理、数学…...

(11)Python引领金融前沿:投资组合优化实战案例

1. 前言 本篇文章为 Python 对金融的投资组合优化的示例。投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程&#xff0c;目的是最大限度地提高回报和降低风险。 投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程&#xff0c;目的是最大限度地提高回报…...

git删除本地远程分支

gitlab删除远程分支 要删除GitLab上的远程分支&#xff0c;你可以使用Git命令行工具。以下是删除远程分支的步骤和示例代码&#xff1a; 首先&#xff0c;确保你已经在本地删除了分支。删除本地分支的命令是&#xff1a; git branch -d <branch_name> 如果分支没有被合…...

前端-04-VScode敲击键盘有键入音效,怎么关闭

目录 问题解决办法 问题 今天正在VScode敲项目&#xff0c;不知道是按了什么快捷键还是什么的&#xff0c;敲击键盘有声音&#xff0c;超级烦人啊&#xff01;&#xff01;于是我上网查了一下&#xff0c;应该是开启了VScode的键入音效&#xff0c;下面是关闭键入音效的办法。…...

JMeter数据库连接操作及断言

一、数据库操作 应用场景&#xff1a; 接口自动化数据校验&#xff1a;用于验证接口返回的数据与数据库中的数据是否一致。特殊业务&#xff1a;处理一些与数据库相关的特殊业务逻辑。性能测试&#xff1a;测试数据库的性能&#xff0c;如查询、更新等操作的响应时间。 连接数…...

Maven settings.xml 私服上传和拉取配置

公司内部自行开发的依赖包需要上传到maven私服时&#xff0c;可以在项目的pom.xml中配置&#xff0c;也可以在本地计算机的maven目录settings.xml中配置。本文讲述的是如何在settings.xml中进行配置。 场景&#xff1a;有两个maven私服&#xff0c;其中一个为公司的&#xff0…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...