python 静态变量_python小课堂19 - 面向对象篇(二)

前言

哈喽呀Everybody,又到了更新干货的时间了,继续python小课堂的回归之路,面向对象篇的第二章,面向对象的涉及的东西实在是太多了,所以打算拆开三次写吧,后面还有一次面向对象篇,但是打算写完这篇之后用面向对象的设计思想来一波实战篇教学,依然是和安全相关的,敬请期待.....

实例对象中的self

回顾下上一章中,学习了定义一个对象(类)的方法,并且这个类中有自己的类变量以及实力变量,还有自己对应的方法以及构造方法。在实例方法中有个特殊的关键词需要默认传入 -- self 。来看下引用上节的例子。

class GirlFriend(): # 交过的女朋友个数 total_nums = 0 # 初始化构造方法 def __init__(self,name,age): self.name = name self.age = age # 行为,说出自己的特征 def say_feature(self): print(f'我的姓名:{self.name}') print(f'我的年龄:{self.age}')girlFriend = GirlFriend('人类女孩',18) # 实例化girlFriend.say_feature()

实际上,self这个关键字并不一定非得叫self,如果学过java的同学一定知道this这个关键词,特指在一个类中实例对象生成后的本身,而python中的self与其一致,我们可以将self修改成this来看下程序会不会正常运行。

0b8f7f4b2c7acb54556d6ced494525bc.png

可以看到上图,改成this后依然成功运行,所以self只是python中的一个官方写法,具体你要定义成什么样子的默认第一个参数,随你喜好,但是推荐默认self就好啦。

实例对象中的变量机制(dict)

通过 dict可以查看实例对象的属性。什么意思呢?来看下:

class GirlFriend(): # 交过的女朋友个数 total_nums = 0 # 初始化构造方法 def __init__(self, name, age): self.name = name self.age = age # 行为,说出自己的特征 def say_feature(self): print(f'我的姓名:{self.name}') print(f'我的年龄:{self.age}')girlFriend = GirlFriend('人类女孩', 18) # 实例化print(girlFriend.__dict__)
f6ae33af2b294c78336ea5d62db4483c.png

可以看到结果,将实例化后的对象中的变量成员以字典的形式打印出来,name和age是实例变量,而人类女孩和18便是我通过创建对象时传入的参数。

实例方法访问变量

实例方法:见名知意,即类中定义的方法,需要实例化对象后才能调用的方法称之为实例方法。比如在上面的GirlFriend类中的say_feature(),就叫实例方法。那么问题来了,实例方法可以直接访问实例变量,这是大家都可以想到的,比如在say_feature()中通过self.name调用了实例变量name。那实例方法中如何访问类的变量呢?在上面的代码中,类变量就是total_nums,也就是你迄今为止交过女朋友的总数量。 先来个 错误的例子:

class GirlFriend(): # 交过的女朋友个数 total_nums = 0 # 初始化构造方法 def __init__(self, name, age): self.name = name self.age = age print(f'访问类变量total_nums:{total_nums}') # 行为,说出自己的特征 def say_feature(self): print(f'我的姓名:{self.name}') print(f'我的年龄:{self.age}')girlFriend = GirlFriend('人类女孩', 18) # 实例化print(girlFriend.__dict__)
e80ff97306acb25589a52eb1d0ac293d.png

看到控制台报错,输出没有定义total_nums,说明这种方式在实例方法中直接访问类变量是错误的。

正确的例子1:

a3de1adb040e0dae1c6a4568a51cbc09.png

实际上在上一节的python小课堂的末尾处,提到过如何在类外访问类变量,直接通过类.变量即可访问,在实例对象内部也可以通过这种方式进行访问。

正确的例子2:

9a7f8520ad81469415068bdc7371313d.png
# 通过 self.__class__ 调用类变量也可以进行调用self.__class__.total_nums

类变量还有个特性,就是实例化对象将其共有,这种场景也许在以后的编程中会遇到,我这里依然以女朋友举例,每个实例变量是你每个不同女票的名字和年龄,而假设你每次交一个女票,这个交女朋友的总数total_nums就会增加1。

来看下代码示例:

class GirlFriend(): # 交过的女朋友个数 total_nums = 0 # 初始化构造方法 def __init__(self, name, age): self.name = name self.age = age self.__class__.total_nums += 1 print(f'迄今为止交到的女朋友个数total_nums:{self.__class__.total_nums}') # 行为,说出自己的特征 def say_feature(self): print(f'我的姓名:{self.name}') print(f'我的年龄:{self.age}')girlFriend = GirlFriend('人类女孩1', 18) # 实例化girlFriend2 = GirlFriend('人类女孩2', 23) # 实例化girlFriend3 = GirlFriend('人类女孩3', 20) # 实例化
9588af61f1743d92d0109bc2f151bec0.png

看到结果,每次实例化一个女盆友,总数都会增加一次使用场景自行细细品味一番吧......

再多说一句,方法和变量之间的关系:变量其实就是我们日常所说的数据,而方法就是如何去处理数据,也就是将变量读取后进行相关处理。这层处理关系就是方法和变量的关系!

类方法

在本章开篇处介绍了实例方法,那么类方法则是不需要进行实例化对象,可以直接通过类.方法进行调用。来看下面的例子:

class GirlFriend(): # 交过的女朋友个数 total_nums = 0 # 初始化构造方法 def __init__(self, name, age): self.name = name self.age = age # 行为,说出自己的特征 def say_feature(self): print(f'我的姓名:{self.name}') print(f'我的年龄:{self.age}') # 类方法 @classmethod def make_girlfriend_count(cls): cls.total_nums += 1 print(f'迄今为止交到的女朋友个数total_nums:{cls.total_nums}')GirlFriend.make_girlfriend_count()GirlFriend.make_girlfriend_count()girlFriend = GirlFriend('人类女孩1', 18) # 实例化girlFriend.make_girlfriend_count()

通过在方法上面加上 @classmethod,这样来定义类方法,这个写法可以先了解下,后序会讲到python的装饰器,就知道这种写法的意义了。classmethod,中文翻译就是类方法的意思,在方法的默认参数中,需要默认给出一个 cls作为参数,这里类似实例方法中的self字段,他们都是形式上的默认参数,名字可以改变,不一定必须叫cls,python默认会给出cls,而cls是class的简写, 也指代的是自己本身。

将交到女朋友的个数作为类方法来演示下最终的运行结果:

ab3f095bee1d6821444290460cb22a96.png

调用类方法时,只需要通过类名称直接调用即可。当然python也支持先实例化在调用类方法,也不会报错,可以看到上图中最后一次 调用,但是绝不推荐这样用,因为没有意义!

静态方法

静态方法:定义时,不需要像类方法和实例方法默认传入参数,在方法上面声明一个叫@staticmethod的装饰器,staticmethod,中文翻译静态方法。来看下写法:

class GirlFriend(): # 交过的女朋友个数 total_nums = 0 # 初始化构造方法 def __init__(self, name, age): self.name = name self.age = age # 行为,说出自己的特征 def say_feature(self): print(f'我的姓名:{self.name}') print(f'我的年龄:{self.age}') # 类方法 @classmethod def make_girlfriend_count(cls): cls.total_nums += 1 print(f'迄今为止交到的女朋友个数total_nums:{cls.total_nums}') @staticmethod def study_language(language,score): print(f'我在学习{language},熟练分数:{score}')GirlFriend.study_language('中文',90)
43c81ac862fbd93982b1279500df29b1.png

注:在静态方法和类方法中,是无法直接用self.xxx引用实例变量的。可自行尝试!

类方法和静态方法的区别:在调用时,都可以通过类名直接进行调用。但是一般不推荐使用静态方法,因为类方法同样可以实现,并且可以通过默认参数cls直接引用类中的类变量使用。

总结

以上就是python面向对象的第二部分,后面我会画一个思维导图来整理下学到的相关知识,其实图一画出来,逻辑就非常清晰了。回顾下本章内容,介绍了self的应用,类方法的应用,实例方法的应用以及相互之间访问的关系。文章略长,还望耐心观看....切忌浮躁(也是说给自己的!)

至此完!

有想学python的同学,欢迎关注公号:migezatan.(咪哥杂谈)

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值