鱼C论坛

 找回密码
 立即注册
查看: 1452|回复: 26

[已解决]第37讲 动动手乌龟吃鱼中__init__的理解

[复制链接]
发表于 2020-5-15 13:16:11 | 显示全部楼层 |阅读模式

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

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

x
在这道题中,老师定义class Turtle和class Fish的时候,都是用了__init__:
class Turtle:
    def __init__(self):
        self.power = 100
        self.x = r.randint(legal_x[0], legal_x[1])
        self.y = r.randint(legal_y[0], legal_y[1])
但如果不适用init方法,直接给x,y,power赋值,是不是也可以呢?我这样运行了一下,也没有报错:
class Turtle:
    
    power = 100
    x = r.randint(legal_x[0], legal_x[1])
    y = r.randint(legal_y[0], legal_y[1])
那请问这个__init__具体需要在什么时候使用?
如果不需要我们通过输入赋值(这一讲甲鱼老师的例子用了Ball(self, name),这时候确实直接通过init给name赋值挺方便)的时候,使用这个方法跟我们在类中直接给参数赋值有什么区别?
感觉自己对init还是理解的不到位,望各位不吝赐教
最佳答案
2020-5-15 16:51:10
Tigeroad 发表于 2020-5-15 16:40
请问是这样吗?这样还是可以调用呀

试试这个:
class Ball:
    def kick(self):
        self.name = '给个最佳'

b = Ball()
print(b.name)
然后再试试这个:
class Ball:
    def __init__(self):
        self.name = '给个最佳'

b = Ball()
print(b.name)

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

使用道具 举报

发表于 2020-5-15 13:18:10 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-15 13:22 编辑

__init__
差不多就是初始化的意思,还有设置参数的作用

你所有值在这里先初始化,是一个良好的编程习惯

你第二个类里面没有定义方法,属性写在类里面 方法外的话是属于类属性

你可以看下 我整理的笔记 区分下类里面的东东:

文档:类、实例、局部变量.note
链接:http://note.youdao.com/noteshare?id=d121373edf297b4601ba697ad8e220ea&sub=02ACF9322A2B4E619E7E6F44BD603893

如果帮助到你了,设个最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-15 13:18:14 | 显示全部楼层
本帖最后由 焦健鬼 于 2020-5-15 14:10 编辑

init不用的话有可能报错,但是并不一定会报错
(求最佳)@不二如是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:19:05 | 显示全部楼层
__init__() 是初始化方法,是实例化时要做的事,你在类里边写定义的是类属性,不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:19:05 | 显示全部楼层
貌似不用魔法方法,定义不了实例化属性
你这定义的都是类属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:28:27 | 显示全部楼层
__init__就是初始化数据的作用,还可以设置传入的参数有哪些

你第二块那的代码没有方法,在类里面,方法外面设置的属性叫类属性(变量)

看下这边我整理的笔记吧
笔记:类、实例、局部变量
链接:http://note.youdao.com/noteshare?id=d121373edf297b4601ba697ad8e220ea&sub=02ACF9322A2B4E619E7E6F44BD603893

希望能帮助到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:31:24 | 显示全部楼层
焦健鬼 发表于 2020-5-15 13:18
init不用的话有可能报错,但是并不一定会报错
(求最佳)

哇,兄弟,写的这么草率就求最佳吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-15 13:33:37 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-15 13:31
哇,兄弟,写的这么草率就求最佳吗?

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

使用道具 举报

发表于 2020-5-15 13:34:21 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-15 13:31
哇,兄弟,写的这么草率就求最佳吗?

我又卡了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:36:59 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-15 13:34
你现在被审核了,先不要发帖了

问题是我发啥我都看不见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:37:59 | 显示全部楼层
焦健鬼 发表于 2020-5-15 13:18
init不用的话有可能报错,但是并不一定会报错
(求最佳)

你现在因为发帖频率过高,发出去的帖子会被审核,所以先不要发帖了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:41:35 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-15 13:37
你现在因为发帖频率过高,发出去的帖子会被审核,所以先不要发帖了

多久才能发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 13:42:23 | 显示全部楼层
焦健鬼 发表于 2020-5-15 13:18
init不用的话有可能报错,但是并不一定会报错
(求最佳)

别回了啊喂!听不懂吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 14:09:37 From FishC Mobile | 显示全部楼层
本帖最后由 _2_ 于 2020-5-15 14:11 编辑

不用 __init__() 的话,就无法向类传递参数,主要是初始化的时候,
写 __init__() 的目的就是为了能根据传递的参数,做出不同的变化:
class A:
    def __init__(self, value)
        self.value = value

>>> a = A(1)
>>> a.value
1
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-15 15:37:25 | 显示全部楼层
_2_ 发表于 2020-5-15 14:09
不用 __init__() 的话,就无法向类传递参数,主要是初始化的时候,
写 __init__() 的目的就是为了能根据传 ...

如果像这个题一样,不需要输入给参数赋值,为什么还要使用__init__()方法呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 15:49:47 | 显示全部楼层
Tigeroad 发表于 2020-5-15 15:37
如果像这个题一样,不需要输入给参数赋值,为什么还要使用__init__()方法呢

__init__初始化数值,定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。
如果你不设置__init__会导致你想查看实例里面的属性是会返回空的,你可以用  dict  来试着查看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-15 16:40:05 | 显示全部楼层
Twilight6 发表于 2020-5-15 15:49
__init__初始化数值,定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。
如果 ...
>>> class Ball:
        name = '土豆'
        def kick(self):
                print(self.name)

>>> b = Ball
>>> b.name
'土豆'
请问是这样吗?这样还是可以调用呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 16:43:22 | 显示全部楼层
Tigeroad 发表于 2020-5-15 16:40
请问是这样吗?这样还是可以调用呀

这个是类变量 不是实例变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 16:44:26 | 显示全部楼层
Tigeroad 发表于 2020-5-15 16:40
请问是这样吗?这样还是可以调用呀


我这有整理的笔记  推荐你看看  

文档:类、实例、局部变量
链接:http://note.youdao.com/noteshare?id=d121373edf297b4601ba697ad8e220ea&sub=02ACF9322A2B4E619E7E6F44BD603893
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 16:51:10 | 显示全部楼层    本楼为最佳答案   
Tigeroad 发表于 2020-5-15 16:40
请问是这样吗?这样还是可以调用呀

试试这个:
class Ball:
    def kick(self):
        self.name = '给个最佳'

b = Ball()
print(b.name)
然后再试试这个:
class Ball:
    def __init__(self):
        self.name = '给个最佳'

b = Ball()
print(b.name)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 04:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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