百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

小猿圈python学习-类方法、静态方法

off999 2024-09-20 22:50 39 浏览 0 评论

类方法

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

class Dog(object):
 def __init__(self, name):
 self.name = name
 @classmethod
 def eat(self):
 print("%s is eating" % self.name)
d = Dog("Mjj")
d.eat()

执行报错如下,说Dog没有name属性,因为name是个实例变量,类方法是不能访问实例变量的

Traceback (most recent call last):
 File "/Users/alex/PycharmProjects/apeland_py_learn/day6_面向对象进阶/类方法.py", line 11, in 
 d.eat()
 File "/Users/alex/PycharmProjects/apeland_py_learn/day6_面向对象进阶/类方法.py", line 7, in eat
 print("%s is eating" % self.name)
AttributeError: type object 'Dog' has no attribute 'name'

此时可以定义一个类变量,也叫name,看下执行效果

class Dog(object):
 name = "我是类变量"
 def __init__(self, name):
 self.name = name
 @classmethod
 def eat(self):
 print("%s is eating" % self.name)
d = Dog("Mjj")
d.eat()

输出

我是类变量 is eating

类方法的应用场景举例

现有一个Student类, 每生成一个Student实例,学生总数就自动+1,

class Student(object):
 stu_num = 0 # 学员计数需存在类变量里,不能存在每个实例里,因为每个实例的内存是独立的,每实例化一次,数据就会被重置一次,不会累加
 def __init__(self,name):
 self.name = name
 self.stu_num += 1
 print("total student num:",self.stu_num)
s1 = Student("张1")
s2 = Student("张2")
s3 = Student("张3")
s4 = Student("张4")

执行输出

total student num: 1
total student num: 1
total student num: 1
total student num: 1

为何每次都是1呢? 不应该累加么?

self.stu_num += 1 ,相当于对每个实例进行了一次赋值, 因为self代表实例本身,self.stu_num += 1 相当于s1.stu_num =1 , s2.stu_num = 1 …, 把这句代码改成如下就可以

 def __init__(self,name):
 self.name = name
 Student.stu_num += 1 # 直接用类名调用
 print("total student num:",self.stu_num)

输出

total student num: 1
total student num: 2
total student num: 3
total student num: 4

由于stu_num是每增加一个学员才加1的,不应该允许直接Student.stu_num+=1,不安全。可以封装成私有变量,再通过类方法调用并计数

class Student(object):
 __stu_num = 0 # 学员计数需存在类变量里,不能存在每个实例里
 def __init__(self,name):
 self.name = name
 self.add_stu_num() # 相当于Student.add_stu_num() 初始化学员时调用
 @classmethod
 def add_stu_num(cls): # 注意这里调用时传进来的其实是类本身,不是实例本身,所以参数名一般改为cls
 cls.__stu_num += 1
 print("total student num:",cls.__stu_num)
s1 = Student("张1")
s2 = Student("张2")
s3 = Student("张3")
s4 = Student("张4")
Student.add_stu_num() # 也可以这样调

静态方法

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

class Student(object):
 stu_num = 0
 def __init__(self,name):
 self.name = name
 @staticmethod
 def fly(self):
 print("%s is flying..." % self.name)
 print(self.stu_num)
s = Student("Mjj")
s.fly()

上面的调用会出以下错误,说是fly需要一个self参数,但调用时却没有传递,没错,当fly变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

Traceback (most recent call last):
 File "/day6_面向对象进阶/静态方法.py", line 17, in 
 s.fly()
TypeError: fly() missing 1 required positional argument: 'self'

想让上面的代码可以正常工作有两种办法

1. 调用时主动传递实例本身给fly方法,即s.fly(s)

2. 在fly方法中去掉self参数,但这也意味着,在fly中不能通过self.调用实例中的其它变量了

相关推荐

360系统重装大师装win7(360重装大师怎么装win7)
  • 360系统重装大师装win7(360重装大师怎么装win7)
  • 360系统重装大师装win7(360重装大师怎么装win7)
  • 360系统重装大师装win7(360重装大师怎么装win7)
  • 360系统重装大师装win7(360重装大师怎么装win7)
十大口碑最好的台式电脑(目前最好的台式)

一:联想电脑联想公司是全世界500强公司,也是全世界最大的pc电脑生产商之一。目前在点信息科技产业内全方位发展,是一家具有创造力的科技大公司,在全世界也就具有极高的品牌价值。二:戴尔电脑戴尔也是PC电...

显卡天梯图3050ti(显卡天梯图快科技)

RTX3050Ti的最新跑分达到了71803。根据Geekbench的信息,RTX3050Ti搭载20组CU,也就是2560个CUDA核心,GPU频率为1.49GH...

office完整版下载(office2019完整版下载)

word是office软件中的一部份,完全的安装了office软件就等于安装了word。安装具体步骤如下:1、搜索,下载Office安装包。2、下载完成后,将Office安装包解压。选中Offic...

qq邮箱网页登陆(qq邮箱网页登陆提示安全风险要验证码)

qq邮箱的登录方法:1登录QQ后,正常情况下头像旁边有一个邮箱图标,点击直接登录QQ邮箱2如果没有在主面板上显示的话,可以点击界面管理器添加3在界面管理的右侧,找到QQ邮箱并设置为选状态这样就可直接从...

360软件管家有必要安装吗

360电脑管家这类软件属于安全软件,其作用是用来防病毒木马。有无安装必要主要看你的电脑使用习惯。比如有的电脑不联网,而且不插外来U盘,这样的电脑几乎与外界隔离,就没有必要安装安全软件。再比如有的电脑经...

如何桥接无线路由器并设置上网

1、登录副路由器管理界面操作电脑连接到副路由器的LAN口或无线信号(默认为TP-LINK_XXXX),打开浏览器,清空地址栏并输入tplogin.cn或192.168.1.1,设置不少于6位数的登录密...

电脑配置搭配(电脑配置搭配表)

电脑配置搭配需要考虑多个组件,包括CPU、主板、显卡、内存、硬盘、电源以及散热器等。以下是一些建议和指南:CPU选择:CPU是电脑的心脏,决定了电脑的整体性能。选择CPU时需要考虑核心数、主频、线程数...

新买的电脑从哪下载应用(电脑软件应用商店哪个好)
  • 新买的电脑从哪下载应用(电脑软件应用商店哪个好)
  • 新买的电脑从哪下载应用(电脑软件应用商店哪个好)
  • 新买的电脑从哪下载应用(电脑软件应用商店哪个好)
  • 新买的电脑从哪下载应用(电脑软件应用商店哪个好)
windows7安装步骤简述(win7的安装)

运行温度时期的电脑怎么组装?官方已经给出了相关配置:处理器(cpu)最好是主频1GHZ以上,32位或64位处理器,不过目前的处理器几乎都是64位的了,一般双核处理器都在1GHZ以上。  也就是说目前绝...

电脑删除的数据怎么恢复(电脑删除数据怎么恢复原状)

步骤一:打开电脑上已经装好的Superrecovery软件,直接进入到“向导模式”。首先,大家需要做的就是选择文件所在的位置,例如:需要恢复的数据是在移动存储设备上(如:U盘、SD卡等),直接选择设备...

小马激活office2010(小马激活win11)
  • 小马激活office2010(小马激活win11)
  • 小马激活office2010(小马激活win11)
  • 小马激活office2010(小马激活win11)
  • 小马激活office2010(小马激活win11)
删除数据恢复(删除数据恢复出厂设置)

1.在手机上下载手机数据恢复精灵,进入软件之后,选择微信恢复。2.点击开始恢复,选择需要恢复的联系人,等待一会儿,就能看到恢复好的聊天记录。3.可以安装打开互盾安卓恢复大师,手机数据线连接手机后,点击...

复制粘贴不了怎么解决(电脑不能复制粘贴了怎么处理)

1、查看手机输入法的剪贴板选项,是否有复制的文本,如果有就直接点击就可以直接输入了。2、复制后,长按不出来粘贴键的时候,需要把应用程序关闭掉重新开,重新复制粘贴,或者尝试重启手机。3、可以尝试重新复制...

u盘被写保护去除步骤(u盘的被写保护怎么解除)

U盘被写保护通常是因为存储器故障、病毒感染、文件系统损坏等原因导致的,但可以通过以下几种方法进行解除:1.检查U盘开关:一些U盘可能会有物理上的写保护开关,将其关闭即可解除写保护。2.使用命令行清...

取消回复欢迎 发表评论: