Tigeroad 发表于 2020-5-15 13:16:11

第37讲 动动手乌龟吃鱼中__init__的理解

在这道题中,老师定义class Turtle和class Fish的时候,都是用了__init__:
class Turtle:
    def __init__(self):
      self.power = 100
      self.x = r.randint(legal_x, legal_x)
      self.y = r.randint(legal_y, legal_y)

但如果不适用init方法,直接给x,y,power赋值,是不是也可以呢?我这样运行了一下,也没有报错:
class Turtle:
   
    power = 100
    x = r.randint(legal_x, legal_x)
    y = r.randint(legal_y, legal_y)

那请问这个__init__具体需要在什么时候使用?
如果不需要我们通过输入赋值(这一讲甲鱼老师的例子用了Ball(self, name),这时候确实直接通过init给name赋值挺方便)的时候,使用这个方法跟我们在类中直接给参数赋值有什么区别?
感觉自己对init还是理解的不到位,望各位不吝赐教

Twilight6 发表于 2020-5-15 13:18:10

本帖最后由 Twilight6 于 2020-5-15 13:22 编辑

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

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

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

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

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

如果帮助到你了,设个最佳吧{:9_228:}

焦健鬼 发表于 2020-5-15 13:18:14

本帖最后由 焦健鬼 于 2020-5-15 14:10 编辑

init不用的话有可能报错,但是并不一定会报错
(求最佳)@不二如是

zltzlt 发表于 2020-5-15 13:19:05

__init__() 是初始化方法,是实例化时要做的事,你在类里边写定义的是类属性,不一样的

qiuyouzhi 发表于 2020-5-15 13:19:05

貌似不用魔法方法,定义不了实例化属性
你这定义的都是类属性

Twilight6 发表于 2020-5-15 13:28:27

__init__就是初始化数据的作用,还可以设置传入的参数有哪些

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

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

希望能帮助到你

永恒的蓝色梦想 发表于 2020-5-15 13:31:24

焦健鬼 发表于 2020-5-15 13:18
init不用的话有可能报错,但是并不一定会报错
(求最佳)

哇,兄弟,写的这么草率就求最佳吗?

焦健鬼 发表于 2020-5-15 13:33:37

永恒的蓝色梦想 发表于 2020-5-15 13:31
哇,兄弟,写的这么草率就求最佳吗?

呵呵

焦健鬼 发表于 2020-5-15 13:34:21

永恒的蓝色梦想 发表于 2020-5-15 13:31
哇,兄弟,写的这么草率就求最佳吗?

我又卡了

焦健鬼 发表于 2020-5-15 13:36:59

永恒的蓝色梦想 发表于 2020-5-15 13:34
你现在被审核了,先不要发帖了

问题是我发啥我都看不见{:10_257:}

永恒的蓝色梦想 发表于 2020-5-15 13:37:59

焦健鬼 发表于 2020-5-15 13:18
init不用的话有可能报错,但是并不一定会报错
(求最佳)

你现在因为发帖频率过高,发出去的帖子会被审核,所以先不要发帖了

焦健鬼 发表于 2020-5-15 13:41:35

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

多久才能发

永恒的蓝色梦想 发表于 2020-5-15 13:42:23

焦健鬼 发表于 2020-5-15 13:18
init不用的话有可能报错,但是并不一定会报错
(求最佳)

别回了啊喂!听不懂吗?

_2_ 发表于 2020-5-15 14:09:37

本帖最后由 _2_ 于 2020-5-15 14:11 编辑

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

>>> a = A(1)
>>> a.value
1
>>>

Tigeroad 发表于 2020-5-15 15:37:25

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

如果像这个题一样,不需要输入给参数赋值,为什么还要使用__init__()方法呢

Twilight6 发表于 2020-5-15 15:49:47

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

__init__初始化数值,定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。
如果你不设置__init__会导致你想查看实例里面的属性是会返回空的,你可以用dict来试着查看下

Tigeroad 发表于 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
'土豆'
请问是这样吗?这样还是可以调用呀

Twilight6 发表于 2020-5-15 16:43:22

Tigeroad 发表于 2020-5-15 16:40
请问是这样吗?这样还是可以调用呀

这个是类变量 不是实例变量

Twilight6 发表于 2020-5-15 16:44:26

Tigeroad 发表于 2020-5-15 16:40
请问是这样吗?这样还是可以调用呀

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

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

Twilight6 发表于 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)

页: [1] 2
查看完整版本: 第37讲 动动手乌龟吃鱼中__init__的理解