鱼C论坛

 找回密码
 立即注册
查看: 4381|回复: 6

[学习笔记] 【第038讲心得】【类和实例化、init含义解析 】

[复制链接]
发表于 2018-12-10 16:19:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 heidern0612 于 2018-12-17 10:21 编辑

写心得的过程都是自我思考的过程,借鉴了很多论坛大神和前辈的经验,难免有疏漏和错误,恳请指出,不胜感激。


不知不觉学到第38讲,心里惴惴不安,总感觉好像什么都没学到,又好像学到点什么,试着去回忆的时候,却发现一脑袋空白。

好像达到了“无招胜有招”的境界。


老师的例题这一节还算比较简单(我真的不愿意面对数学,为啥老师出的都是个数学题啊,最后一题那个公式是个啥谁能告诉我),

如果有同学不明白的,欢迎跟帖跟我一起讨论。

借老师的038讲,厚着脸皮强行装逼一波,想谈一谈类中的__init__到底是个啥。

说init之前先说说类和实例都是什么吧。



1、类和实例

老师课堂讲的蛮好,类其实就好比一张建筑图纸,你可以按照图纸造出房子,但是你不能说图纸就是房子。

如果说这个例子比较抽象,那就在实例化点。


比如你叫John Ramble,我在跟人介绍的时候,我会说:“这是我的朋友,John”,甚至我会跟朋友大吹特吹你是越战英雄。

但我肯定不能跟人介绍说:“这是我的朋友,他是个人类。”,那就不是介绍朋友,那是要打架了。


以上例子中,图纸和人都是比较抽象的东西,这个东西看不见摸不着,但是可以代表一大类的东西。

而房子和你都是比较实例化的东西,这东西看得见摸的着,一个只能代表一个个体,比如你的名字和别人的名字、你的指纹和别人的指纹。


图纸可以指代很多房子,每个房子虽然一样,但是住的人不一样。

人类可以代表很多人,但每个人却只有唯一的一个名字。

               有同学说,人有重名的啊……卧槽,再见拜拜来不及分手祝你幸福。





2、举个栗子说明,先传入一个最终的init例子


A、调用__init__:

  1. class Person():
  2.     def __init__(self,name,age):
  3.             self.Xname = name
  4.             self.Xage = age
  5.             print(f"你的名字是:{self.Xname},你的年龄是{self.Xage}")

  6. male = Person("John","28")
复制代码



首先我创建了一个人的类,在人的类里面我定义了一些人的属性,名字和年纪。

我初始化了下函数,方便后面的直接调用,然后我print了调用函数的例子。


这里面,self代表的是实例的本身,也就是说,实例的本身就是个参数,代表self。

Xname用于区别name(一般的时候我们都这么写:self.name =name)。

这里Xname代表的是实例的名字,而name代表的是类中形参的名字。(Xname代表实际的名字,而name只是代表一个抽象的名字),Xage同理。

图纸有了(class类),下面只要把图纸实例化,如例中把Person()类赋值给male这个变量,就代表Person()类实例化了。

下面只需要传递给male这个实例化对象两个参数就可以了,如例中传入名字john和28。



3、__init__到底啥用?

init代表初始化的意思,如上例子中,一是直接自动调用函数内部形参,二是啥呢?

二嘛,从字面理解,初始化。初始化是个什么鬼?

简单说,举个栗子,比如你要上战场了,不能凭着一腔赤血光着屁股就上战场吧?

你起码得先准备好弹药和粮草,然后考虑到战场的复杂性和地形的多变性,你得准备好钢盔和靴子吧?


再举个栗子,比如你玩一款RPG游戏,进游戏了,最先有个名字,但是你不能就一个名字闯天下吧?

最起码的属性呢?装备呢?再比如说天赋呢?加点呢?什么什么什么的,这些就是需要初始化的东西。

恍然大悟,卧槽,这东西不就是游戏界面里的东西吗?

对,这东西其实就是游戏的时候,需要提前跟你说明或者告诉你这是血条,这是蓝条,这是素质点,力量加攻击,敏捷加闪避的东西。



4、如果不用__init__可以吗?

完全可以,只要你不觉得调用麻烦,或者你也可以留着__init__不用,等到自己熟悉的时候再用。



5、定义的时候,一定要加个self吗?

之前也说了,self代表的是实例的本身,实例的本身其实就是函数定义时self的变量,也就是说,实例本身就是个变量。

定义函数的时候,自然可以不加,函数本身就代表它自己,但是定义类的时候,如果你不加self,怎么能区别出来实例化形形色色的人或建筑呢?

如果你觉得自己不爽,或者self太难写,你也可以写个有意思的变量,如lizi或者你任意喜欢的名字。


如以下代码:

不用init调用函数
  1. class Person():
  2.     def subs(ro,name,age):
  3.             ro.Xname = name
  4.             ro.Xage = age
  5.             print(f"你的名字是:{ro.Xname},你的年龄是{ro.Xage}")

  6. person = Person()

  7. person.subs("john","35")
复制代码



或者使用init调用函数

  1. class Person():
  2.     def __init__(我是一个例子,name,age):
  3.             我是一个例子.name = name
  4.             我是一个例子.age = age
  5.             print(f"你的名字是:{我是一个例子.name},你的年龄是{我是一个例子.age}")

  6. male = Person("John","28")
复制代码


也是可以的.



本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-14 21:21:27 | 显示全部楼层
这么好的贴子,赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 11:32:24 | 显示全部楼层
这个帖子 应该让搜36讲的新人小白看到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-14 11:33:40 | 显示全部楼层
比如我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-19 17:54:13 | 显示全部楼层
我无数次把init打成了into 总是在找自己错那
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-30 17:34:34 | 显示全部楼层
很不错的帖子,自己整理一遍思路后在看贴主进一步巩固!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-7 08:35:30 | 显示全部楼层
好好学习
收藏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-16 14:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表