浅析深入浅析python 中的self和cls的区别微蓝晴雨表

本文是关于浅析深入浅析python 中的self和cls的区别微蓝晴雨表,由西南之窗方言教育网yumixiongdi.com2021-06-17日编辑,深入浅析python 中的self和cls的区别,微蓝晴雨表。


深入浅析python 中的self和cls的区别,微蓝晴雨表… 浅析深入浅析python 中的self和cls的区别微蓝晴雨表

python 中的self和cls

一句话描述:self是类(Class)实例化对象,cls就是类(或子类)本身,取决于调用的是那个类。
@staticmethod 属于静态方法装饰器,@classmethod属于类方法装饰器。我们需要从声明和使用两个方面来理解。

详细介绍

一般来说,要使用景文丛某个类的方法,需要先⚠️实例化一个对象再调用方法。而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。🤔

首先定义一个类A,类A中有三个函数,foo1为静态函数,用@staticmethod装饰器装饰,这种方法与类有某种关系但不需要使用到实例或者类来参与。

class A(object): a = 'a' @staticmethod def foo1(name): print('hello', name, A.a) def foo2(self, name): print('hello', name, self.a) @classmethod def foo3(cls, name): print('hello', name, cls.a)class B(A): a = 'b' @staticmethod def foo1(name): print('hello', name, B.a) def foo2(self, name): print('subclass B') print('hello', name, self.a) @classmethod def foo3(cls, name): print('hello', name, cls.a)

如下两种方法都可以正常输出,也就是说

既可以作为类的方法使用,也可以作为类的实例的方法使用。

a = A()b = B()a.foo1("小熊猫") # hello 小熊猫 A.foo1("小熊猫") # hello 小熊猫 b.foo1("大熊猫") # subclass B, hello 大熊猫 bB.foo1("大熊猫") # subclass B, hello 大熊猫 b

foo2为正常的函数,是类的实例的函数,调用方式如下。

实参实例化对象或者类名称传入self对象,取到不同的属性和方法。

a.foo2("小熊猫") # hello 小熊猫 aA.foo2(a, "小熊猫") # hello 小熊猫 aA.foo2(b, "小熊猫") # hello 小熊猫 bA.foo2(A, "小熊猫") # hello 小熊猫 a A.foo2(B, "小熊猫") # hello 小熊猫 bB.foo2(a, "小熊猫") # subclass B, hello 小熊猫 a

foo3为类函数,cls作为第一个参数用来表示类本身. 在类方法中用到,类方法是只与类本身有关而与实例无关的方法。如下两种方法都可以正常输出。

可以看出,传入形参cls的值为前面的调用函数,如果再传入对象或者类名称,会报类型错误,多传了一个参数。

a.foo3("小熊猫")A.foo3("小熊猫")# a.foo3(a, "小熊猫") # TypeError: foo3() takes 2 positional arguments but 3 were given# A.foo3(A, "小熊猫") # TypeError: foo3() takes 2 positional arguments but 3 were givenb.foo3("大熊猫")B.foo3("大熊猫")

@staticmethod和@classmethod的用法

相同:

@staticmethod和@classmethod都可以直接类名.方法名()来调用

区别:

从它们的使用上来看,@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。 如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。 而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
class A(object): a = 'a' @staticmethod def foo1(name): print('hello foo1', name, A.a) print("hello foo4 ", B.foo2(B, "小熊猫")) def foo2(self, name): print('hello foo2', name, self.a) @classmethod def foo3(cls, name): print('hello foo3', name, cls.a) print("hello foo5", cls().foo2(name)) print("hello foo6", cls().foo1(name))class B(A): a = 'b' @staticmethod def foo1(name): print('subclass B, hello', name, B.a) def foo2(self, name): print('subclass B, hello', name, self.a) @classmethod def foo3(cls, name): print('subclass B, hello', name, cls.a)

重点应关注@staticmethod和@classmethod调用本类或其他类的函数和属性的区别

例子1:

关键看第二句 subclass B, hello 小熊猫 b,在调用 B.foo2(B, “小熊猫”) 时,执行了B类型下的foo2()方法,该方法无返回值,因此 下句输出为 hello foo4 None

a = A()a.foo1("小熊猫")# 输出hello foo1 小熊猫 asubclass B, hello 小熊猫 bhello foo4 None

例子2:

a.foo3("小熊猫")# 输出hello foo3 小熊猫 ahello foo2 小熊猫 ahello foo5 Nonehello foo1 小熊猫 asubclass B, hello 小熊猫 bhello foo4 Nonehell红旗h7参数o foo6 None

PS:下面看下python中self和cls的区别

1、self表示一个具体的实例本身。如果用了staticmethod,那么就可以无视这个self,将这个方法当成一个普通的函数使用。朗诗玲珑屿业主论坛

2、cls表示这个类本身。

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

3、whats more,类先调用__new__方法,返回该类的实例对象,这个实例对象就是__init__方法的第一个参数self,即self是__new__的返回值。

总结

到此这篇关于深入浅析python 中的self和cls的区别的文章就介绍到这了,更多相关python 中的self和cls内容请搜索个人范文以前的文章或继续浏览下面的相关文章希望大家以后多多支持个人范文!

微蓝晴雨表。
专题推荐:微蓝晴雨表(10) 个人资料 清明节的由来及传说 清明寄语写一句话 儿童侦探故事 诗篇第一篇 名人尊师的故事 布衣布舍 荣格奖金制度 杜马禅园 藏名诗 节约用水的故事 开心一日游的心情说说 吊唁词 表决心的话 袋熊的便便 人为什么活着这么累 父夫子德言容功 lia开头的成语 唐之韵解说词 入党积极分子现实表现 学苑新报数学天地答案 骂人秘籍 快板词 晓娜手记 哈登通缉令 拿来主义教案 年鉴怎么写 谐音学韩语 罗马统治时期的英国 质数和合数 女生节祝福语 三八妇女节祝福语 赏花的心情短语 班主任工作随笔 立夏文案 办公室工作总结 工作总结报告 微信 形势 个人总结怎么写 团支部工作总结 新冠疫情工作个人总结 教育教学工作总结 见习总结
本文地址:/zixue/20210617/246322.html 转载请注明出处!
相关文章: