self,cls 与 staticmethod,classmethod

2023-11-04 00:38

本文主要是介绍self,cls 与 staticmethod,classmethod,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、总体说明

Python类的方法有三种(self和cls都可以用别的单词代替):

  • 一是通过def定义的 ,  普通的一般的,需要至少传递一个参数,一般用self,这样的方法必须通过一个类的实例去访问,类似于c++中通过对象去访问;
  • 二是在def前面加上@classmethod,这种类方法的一个特点就是可以通过类名去调用,但是也必须传递一个参数,一般用cls表示class,表示可以通过类直接调用;
  • 三是在def前面加上@staticmethod,这种类方法是静态的类方法,类似于c++的静态函数,他的一个特点是参数可以为空,同样支持类名和对象两种调用方式

普通的方法,第一个参数需要是self,它表示一个具体的实例本身。
如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。
而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。

三个方法调用形式的区别:

实例方法(普通方法)——————————————————————随着实例属性的改变而改变

类方法(无论是类调用还是实例调用)——————————————都是类属性的值,不随实例属性的变化而变化

静态方法—————————————————————————不可以访问类属性,故直接输出传入方法的值

 

栗子:

>>> class A(object):def foo1(self):print("Hello",self)@staticmethoddef foo2():print("hello")@classmethoddef foo3(cls):print("hello",cls)>>> a = A()
>>> a.foo1()          #最常见的调用方式,但与下面的方式相同
Hello <__main__.A object at 0x9f6abec>>>> A.foo1(a)         #这里传入实例a,相当于普通方法的self
Hello <__main__.A object at 0x9f6abec>>>> A.foo2()          #这里,由于静态方法没有参数,故可以不传东西
hello>>> A.foo3()          #这里,由于是类方法,因此,它的第一个参数为类本身。
hello <class '__main__.A'>>>> A                 #可以看到,直接输入A,与上面那种调用返回同样的信息。
<class '__main__.A'>

 

二、深入理解

self,cls不是关键字

栗子:

class A:member = "this is a test."def __init__(self):pass@classmethoddef Print1(cls):print("print 1: ", cls.member)def Print2(self):print("print 2: ", self.member)@classmethoddef Print3(paraTest):print("print 3: ", paraTest.member)a = A()A.Print1()  # 相当于Print1(A)
a.Print2()  # 相当于Print2(a), 请注意@classmethod
A.Print3()

result:

print 1:  this is a test.
print 2:  this is a test.
print 3:  this is a test.

可以看出来,Python在通过“.”调用成员函数的时候,会将 “ . ” 前面的东西当作函数的第一个参数调用。

而且Pyhon并不关心我们把类的成员函数的第一个参数的名称是什么,我们可以用任意的名称,可以看Print3的定义就知道了。

 

|-------------------------------------------------scrat-----------------------------------------------------------|

这篇关于self,cls 与 staticmethod,classmethod的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341991

相关文章

python内置装饰器@staticmethod,@classmethod

2.@staticmethod,@classmethod 有了@property装饰器的了解,这两个装饰器的原理是差不多的。@staticmethod返回的是一个staticmethod类对象,而@classmethod返回的是一个classmethod类对象。他们都是调用的是各自的__init__()构造函数。 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用@stat

[LeetCode] 238. Product of Array Except Self

题:https://leetcode.com/problems/product-of-array-except-self/description/ 题目 Given an array nums of n integers where n > 1, return an array output such that output[i] is equal to the product of all

【Live Archive】6393 Self-Assembly【强连通】

传送门:【Live Archive】6393 Self-Assembly 题目分析: 假设我们只用到向上或者向右的块,这样我们只要找到一个回路使得某个块可以和第一个块一样,那么我们就相当于找到了一个循环,这样就可以无限循环了。 但是我们要怎样去找这么一个环?考虑到必须是对应字母 X+,X− X^+,X^-才能建边,然后一个环中一定是多个一对一对的这样的对应字母组成的。 可以发现块的数量那么

【网络安全】Self XSS + 文件上传CSRF

未经许可,不得转载。 文章目录 正文发现反射点实现XSS跨站请求伪造 (CSRF) 与文件上传结合POC 正文 在目标网站 target.com 的“联系我们”表单中,我注意到一个文件上传选项。 我最初输入了一个随机字符串,如 123xss,结果发现服务器没有对这个字符串进行足够的处理,比如转义或过滤,而是将其直接反射到网页中并展示给用户。 于是,我尝试注入XSS

在Yolov8中model.export后self.export=false问题(记录)

遇到一个问题是自己创建了新的Detect检测头,但是在导出模型时,想要修改输出格式,在yolo中可以通过if self.export:来修改网络的返回值格式 当使用model.export()导出时,理论上会自动将export设置为True 但是在实际中发现export=false,于是通过调试发现在ultralytics/engine/exporter.py中 for m in model

Self-study Python Fish-C Note20 P64to65

类和对象 (part 3) 本节主要介绍 类和对象的多态和鸭子类型、私有变量和 __slots__(原视频P64-65)\ 多态 多态是面向对象编程的三大特征之一,另外两个是封装和继承。多态是指同一个运算符、函数或对象,在不同场景下具有不同作用效果的情况。 Python 是一门动态语言,多态本来就是 Python的一种特性。 比如: 加号:两边都是数字的时候就是执行算术运算(相加),如果两边

详解PyTorch中的`remove_self_loops`函数及其在图神经网络中的应用

remove_self_loops 引言什么是自环?`remove_self_loops`函数简介函数的基本用法为什么要移除自环?`remove_self_loops`的实际应用 引言 在图神经网络(GNN)的研究与应用中,数据预处理是实现高效和精确模型的关键步骤之一。remove_self_loops函数在这一过程中扮演了重要角色。本文将深入探讨这一函数的定义、作用以及在

【王树森】RNN模型与NLP应用(9/9):Self-Attention(个人向笔记)

前言 上节课讲到的attention用到了Seq2Seq模型上,而Attention并不局限与Seq2Seq模型,而是可以用在所有RNN模型上。Self-attention在原论文中用到了LSTM上,而本节课做了简单的替换:换成了 Simple RNN。 SimpleRNN + Self-Attention 下面的 h 0 h_0 h0​ 为初始状态,是一个全0向量 无 Self-A

Self-Attention Generative Adversarial Networks解读+部分代码

Self-Attention Generative Adversarial Networks解读+部分代码   引言 这篇是文章是Ian goodfellow他们的新工作,在GAN中引入Attention。 在文章的摘要中作者主要突出了三点。 Self-Attention Generative Adversarial Network(SAGAN)是一个注意力驱动,长范围 关联模型(a

Js中window.parent ,window.top,window.self详解

在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法打开当前窗口的那个窗口。   window.self 功能:是对当前窗口自身的引用。它和window属性是等价的。 语法:window.self 注:window、self、windo