前言

哈喽呀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来看下程序会不会正常运行。

可以看到上图,改成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__)

可以看到结果,将实例化后的对象中的变量成员以字典的形式打印出来,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__)

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

正确的例子1:

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

正确的例子2:

# 通过 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) # 实例化

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

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

类方法

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

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的简写, 也指代的是自己本身。

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

调用类方法时,只需要通过类名称直接调用即可。当然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)

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

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

总结

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

至此完!

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

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

  1. python print 换行_Python小课堂第21课:规整一下我们的输出之打印格式化与字符串...

    整齐的输出,不仅美观,还能方便我们更容易的定位问题的重点.所以我们有必要将我们的输出内容美化一下! 请点击右上角"关注"按钮关注我们,跟着木辛老师深入浅出的掌握输出格式化的方法吧! ...

  2. python不等于_Python小课堂|注释+运算符

    注释 确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释: Python中单行注释以 # 开头,例如: # 这是一个注释 print("Hello, ...

  3. python静态变量_python静态变量

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我这里的代码实现了静态变量的装饰器. 但是,我发现如果我多次运行这个函数,每次调 ...

  4. python静态变量_python如何设置静态变量

    众所周知,Python语言并不支持静态变量,比如下面这样一个应用场景: void foo() { static int count = 0; count ++; } 在Python中无法自然实现这个功 ...

  5. python局部静态变量_python静态变量如何设置?这样的代码你会不会写

    [摘要]众所周知,Python语言并不支持静态变量,在python中也有着不可或缺的地位,那么python静态变量如何设置?这样的代码你会不会写,这些内容也许对python学习有帮助,毕竟实践出真知, ...

  6. python静态变量和静态方法

    python静态变量和静态方法 一.静态变量和静态方法 二.静态变量示例 三.静态方法 一.静态变量和静态方法 1.静态变量和静态方法都属于类的静态成员,它们与普通的成员变量和成员方法不同,静态变量和 ...

  7. daphile的dsd设置_小块头有大能量 篇二:JaguarBoard之Daphile HiFi 畅享

    小块头有大能量 篇二:JaguarBoard之Daphile HiFi 畅享 2016-02-20 12:00:42 58点赞 457收藏 75评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达 ...

  8. 小睿家庭云可以刷linux系统吗,小睿私人云 篇二:小睿私人云刷机

    小睿私人云 篇二:小睿私人云刷机 2019-11-04 16:49:28 11点赞 69收藏 43评论 刷机目的:原版系统系统温度过高,感觉不利于可持续发展.然后作为NAS方案的话,DEBIAN是最为 ...

  9. python 对象_Python小课堂面向对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  10. python导入不在同一路径的函数_Python小课堂|模块

    Python3   模块 在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一 ...

最新文章

  1. 求教关于NFS服务器的防火墙的设置
  2. yar java_Yar 的传输协议学习以及 Java 版本的实现
  3. linux飞信机器人的安装fetion
  4. 2019ICPC(银川) - Largest Common Submatrix(单调栈)
  5. 设某链表中最常用的操作是在链表的尾部_Redis系列(二)底层数据结构之双端链表...
  6. 遭遇一次MySQL猜解注入攻击
  7. kafka operation
  8. 这些解决 Bug 的套路,你都会了不?
  9. xcode--常用快捷键
  10. androidStudio快捷键概览
  11. PS5运行Linux,索尼发布最新驱动!PS5手柄现在已支持Linux系统
  12. 9.Linux性能诊断 --- Web应用安全:攻击,防护与检测,IPv6,容器安全
  13. 蓝牙中的三种音频编码:Apt-X、SBC、AAC,请问分别有什么区别?
  14. 微信公众号编辑器哪个好
  15. 莺尾花数据集–贝叶斯分类(day5)
  16. 音乐计算机研修心得,音乐教师研修总结报告
  17. 命运更喜欢将丰硕约果实馈赠给那些含着泪微笑的灵魂
  18. 华为无线网卡插上服务器没反应,无限网卡插在台式机上没反应啊怎么解决
  19. bookkeeper metadata 获取及密码安全
  20. 单波段彩色变换(伪彩色密度分割)

热门文章

  1. 【通信仿真】基于matlab V-BLAST结构检测算法仿真【含Matlab源码 1683期】
  2. 【图像隐写】基于matlab GUI DWT+DCT+SVD数字水印嵌入提取攻击(带面板)【含Matlab源码 1664期】
  3. 【语音隐写】基于matlab GUI DWT+SVD音频水印嵌入【含Matlab源码 1409期】
  4. 【优化预测】基于matlab贝叶斯网络优化LSTM预测【含Matlab源码 1329期】
  5. 【TWVRP】基于matlab智能水滴算法带时间窗的车辆路径与调度优化问题【含Matlab源码 1228期】
  6. 【人脸识别】基于matlab GUI BP神经网络人脸识别(含识别率)【含Matlab源码 891期】
  7. 【图像分割】基于matlab分水岭算法图像分割【含Matlab源码 390期】
  8. 【VRP】基于matlab遗传算法求解多中心的车辆路径规划问题【含Matlab源码 010期】
  9. php当前工作目录路径,Linux_Linux下使用Shell脚本改变当前工作路径,       She - phpStudy...
  10. 内部收益率irr_爱心人寿心相随年金险,IRR内部收益率测算