写在之前
这几天的阅读量蜜汁低,是什么原因我也没搞清楚,如果你们觉得我哪里写的有问题,或者是哪里不好,欢迎后台或者微信告知我,先行谢过。
昨天的文章 详解类方法之绑定方法与非绑定方法 中写了方法中的绑定方法和非绑定方法,今天我们继续来学习剩下的「类方法」和「静态方法」。
类方法 & 静态方法
在开始之前,先让我们来看下面一段代码:
class Sample: language = "C++" def __init__(self): self.language = "python" def get_class_attr(cls): return cls.language if __name__ == "__main__": print("sample.language:",Sample.language) r = get_class_attr(Sample) print("get class attribute:",r) f = Sample() print("instance attribute:",f.language)
上述代码在类 Sample 中,定义了一个属性 language = “C++”,这个是「类属性」;在初始化方法中,又定义了 self.language = “python”,这个是「实例属性」。
知道了这个,我们然后来分析一下函数 get_class_attr(cls),在这个函数中参数用的是 cls,从函数体来看,要求它引用的对象应该具有属性 language,这说明,不是随随便便哪个对象都可以。很巧的是在前面定义的类 Sample 中就有 language 这个属性,于是在调用这个函数的时候,就直接将该类对象作为方法 get_class_attr() 的参数。
Sample.language 是要得到类属性的值,get_class_attr(Sample) 所返回的就是类 Sample 的属性 Sample.language 的值,所以对于上述例子来说,前面两个 print() 函数打印的结果应该是一样的。
f = Sample() 则是创建了一个实例,然后通过 f.language 访问实例属性。所以对于上述的代码的运行结果如下所示:
sample.language:C++ get class attribute:C++ instance attribute:python
不知道经过我上述的解释你是否明白了,如果没明白,建议你再仔细对比一下上述的运行结果和分析的过程。
在上述的例子中,比较特殊的函数应该是 get_class_attr(cls),它是写在类的外面的,然而这个函数又只能调用前面写的那个类对象,因为不是所有对象都有那个特别的 language 属性,这种函数写在外面不利于后期的维护,我们应该避免这种情况的发生,而避免的方法就是把函数和类写在一起,所以就有了下面这种写法:
class sample: language = "C++" def __init__(self): self.language = "python" @classmethod def get_class_attr(cls): return cls.language if __name__ == "__main__": print("sample.language:",sample.language) r = sample.get_class_attr() print("get class attribute:",r) f = sample() print("instance attribute:",f.language) print("instance get_class_str:",f.get_class_attr())
在上面这个修改的代码中,出现了 @classmethod,这是一个装饰器,我们在函数的那部分讲到过。这里需要我们注意的是,@classmethod 所装饰的方法的参数中,第一个参数不是 self,这个和我们常规认识中的类的方法有所区别。这里使用了参数 cls,这是习惯的写法,当然用其它的也可以。让我们来看一下运行的结果:
sample.language:C++
get class attribute:C++
instance attribute:python
instance get_class_str:C++
通过上面的运行结果我们可以看到,不管是通过类还是实例来执行 get_class_attr() 得到的结果都是类属性的值,这说明装饰器 @classmethod 所装饰的方法,它的参数 cls 引用的对象是类对象 Sample。
至此,「类方法」 的定义就出来了:类方法,就是在类里面定义的方法。该方法由装饰器 @classmethod 装饰,其第一个参数 cls 引用的是这个类对象,即将类本身作为作为引用对象传到这个方法里。
知道了类方法以后,我们可以用同样的思路理解另一个方法 「静态方法」,我们还是先来看一段代码:
import random def judge(n): num = random.randint(1,100) return num - n > 0 class Sample: def __init__(self,name): self.name = name def get_name(self,age): if judge(age): return self.name else: return "the name is stupid" if __name__ == "__main__": s = Sample('rocky') name = s.get_name(23) print(name)
先看一下上面的代码,类 Sample 里面使用了外面的函数 judge(n),这种类和函数的关系也是因为相互关联,所以后期的程序维护可能会出问题,于是为了便于维护,我们同样对程序进行了修改:
import random class Sample: def __init__(self,name): self.name = name def get_name(self,age): if self.judge(age): return self.name else: return "the name is stupid" @staticmethod def judge(n): num = random.randint(1,100) return num - n > 0 if __name__ == "__main__": s = Sample('rocky') name = s.get_name(23) print(name)
同样是经过修改优化,将原来在类外面的函数放到了类里面。但是这不是简单的移动,还要在函数的前面加上 @staticmethod 装饰器,并且要注意的是,虽然这个函数在类的里面,但是跟别的方法是不一样的,它的第一个参数也不是 self,当我们要使用它的时候,可以通过实例调用,比如 self.judge(n),也可以通过类调用这个方法,比如 sample.select(n)。
从上面的程序可以看出,尽管 judge(n) 位于类里面,但它确实一个独立的方法,与类本身没有关系,仅仅是为了免除前面所说的后期维护上的麻烦。但是它也有存在的道理,上面的例子就是一个典型的说明。
所以「静态方法」的定义也就出来了:在类的作用域里面,前面必须要加上一个 @staticmethod 装饰器,我们将这种方法命名为静态方法。
写在之后
方法是类的重要组成部分,本章所讲的类方法和静态方法让我们在使用类的时候有了更加便利的工具。
「方法」的这一块到这里就补充完了,之后我们将继续学习 OOP 的剩下两个特征:「多态」和「封装」,敬请期待。
如果你觉得本篇文章让你有所收获,欢迎点赞转发,你的支持是对我码字最大的动力,分享永远在路上,我们一起加油。
The end。
以上就是深入了解Python 方法之类方法 & 静态方法的详细内容,更多关于python 类方法和静态方法的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]