鱼C论坛

 找回密码
 立即注册
查看: 789|回复: 8

新手关于类与对象的一个问题,求大神讲解一番

[复制链接]
发表于 2018-12-17 22:48:05 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼第37讲课后习题有道关于乌龟和鱼的游戏代码。
下面是小甲鱼答案里的部分代码:
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])

    def move(self):
        # 随机计算方向并移动到新的位置(x, y)
        new_x = self.x + r.choice([1, 2, -1, -2])
        new_y = self.y + r.choice([1, 2, -1, -2])
        # 检查移动后是否超出场景x轴边界
        if new_x < legal_x[0]:
            self.x = legal_x[0] - (new_x - legal_x[0])
        elif new_x > legal_x[1]:
            self.x = legal_x[1] - (new_x - legal_x[1])
        else:
            self.x = new_x
        # 检查移动后是否超出场景y轴边界
        if new_y < legal_y[0]:
            self.y = legal_y[0] - (new_y - legal_y[0])
        elif new_y > legal_y[1]:
            self.y = legal_y[1] - (new_y - legal_y[1])
        else:
            self.y = new_y        
        # 体力消耗
        self.power -= 1
        # 返回移动后的新位置
        return (self.x, self.y)


然后下面是我写的部分代码:
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])
        
    def move(self):
        new.x = self.x + r.choice([1,2,-1,-2])
        new.y = self.y + r.choice([1,2,-1,-2])
        self.power -= 1
        
        if new.x < legal_x[0]:
            new.x = legal_x[0] - (new_x - legal_x[0])
        elif new.x > legal_x[1]:
            new.x = legal_x[1] - (new_x - legal_x[1])
        else:
            new.x = new.x
        if new.y < legal_y[0]:
            new.y = legal_y[0] - (new_y - legal_y[0])
        elif new.y > legal_y[1]:
            new.y = legal_y[1] - (new_y - legal_y[1])
        else:
            new.y = new.y
        return (new.x,new.y)
        
为什么小甲鱼的代码没问题,而我的代码却出现了下面的问题:
Traceback (most recent call last):
  File "C:\Users\Glassy Sky\Desktop\text.py", line 74, in <module>
    pos = turtle.move()
  File "C:\Users\Glassy Sky\Desktop\text.py", line 13, in move
    new.x = self.x + r.choice([1,2,-1,-2])
NameError: name 'new' is not defined

他说我的new.x 没有被定义,但程序里明明是给他赋予了函数表达式。还有这里面的self.x是单纯的一个变量还是一个含有对象的量,如果是单纯的变量的话直接把我这代码里的new.x 换成self.x不就和小甲鱼的一样了吗?
求大神讲解一下我的问题,蟹蟹
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-17 23:04:06 | 显示全部楼层
我只想知道new_x 和 new.x是怎么回事?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-18 07:53:48 | 显示全部楼层
你的init前后应该是各两个下划线,而不是前后各一个。

另外你new后面一会下划线,一会“.”是什么意思?

new.x不赋值实例属性,怎么调用类方法?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-18 11:47:50 | 显示全部楼层
ba21 发表于 2018-12-17 23:04
我只想知道new_x 和 new.x是怎么回事?

这个是我笔误,我把这个变量统一了之后还是报同样的错误啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-18 11:51:15 | 显示全部楼层
heidern0612 发表于 2018-12-18 07:53
你的init前后应该是各两个下划线,而不是前后各一个。

另外你new后面一会下划线,一会“.”是什么意思? ...

init前面我打的是各两个下划线,那个一会new 一会下划线一会'.'是我笔误,我改了之后还是报同样的错误警告,你说的new.x不赋值实例属性是什么意思,这个我一直没弄懂,你能给我讲解一下吗?它应该怎么改正呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-18 13:05:38 | 显示全部楼层
本帖最后由 heidern0612 于 2018-12-18 13:10 编辑

你返回的应该是个self的变量,而不是函数内部的变量。

类属性和实例属性是两码事,类属性就相当于图纸中的一部分,而实例属性相当于房子中的一部分。

你return的结果没有self的话,实例属性根本没办法调用。

self本身就相当于实例,你根本都没传实例进入,返回的只是个图纸(类属性),而不是房子(实例),怎么用?

如果你不太明白实例属性和类属性有什么区别的话,你可以看看我写的这个:

戳我前进
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-18 13:09:35 | 显示全部楼层
实在想用新变量,你可以这么写:
  1. import random as r

  2. legal_x = [0, 10]
  3. legal_y = [0, 10]

  4. class Turtle:
  5.     def __init__(self):
  6.         self.power = 100
  7.         self.x = r.randint(legal_x[0],legal_x[1])
  8.         self.y = r.randint(legal_y[0],legal_y[1])
  9.         
  10.     def move(self):
  11.         
  12.         self.new_x = self.x + r.choice([1,2,-1,-2])
  13.         self.new_y = self.y + r.choice([1,2,-1,-2])
  14.         self.power -= 1
  15.         if self.new_x < legal_x[0]:
  16.             self.new_x = legal_x[0] - (self_new_x - legal_x[0])
  17.         elif self.new_x > legal_x[1]:
  18.             self.new_x = legal_x[1] - (self.new_x - legal_x[1])
  19.         else:
  20.             self.new_x = self.new_x
  21.         if self.new_y < legal_y[0]:
  22.             self.new_y = legal_y[0] - (self.new_y - legal_y[0])
  23.         elif self.new_y > legal_y[1]:
  24.             self.new_y = legal_y[1] - (self.new_y - legal_y[1])
  25.         else:
  26.             self.new_y = self.new_y
  27.         return (self.new_x,self.new_y)

  28. tt=Turtle()

  29. print(tt.move())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-19 17:30:29 | 显示全部楼层
heidern0612 发表于 2018-12-18 13:09
实在想用新变量,你可以这么写:

你这改的新变量和我原来的代码唯一不同的是我用的是new_x,你用的是self.new_f。是不是把新变量改成self.之后系统就会根据self.找到你设置的self.new_x这个新变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-19 18:32:20 | 显示全部楼层
Glassy_sky 发表于 2018-12-19 17:30
你这改的新变量和我原来的代码唯一不同的是我用的是new_x,你用的是self.new_f。是不是把新变量改成self. ...

你得知道为什么用的是self.new_x而不是new_x:

你类定义完毕后,类对象(图纸)就生成了,你必须把它实例化(房子)。

你实例化后,类对象(图纸)中的self就代表你实例化的对象(房子)。

除非你不使用变量给self(房子),否则的话,这个self是必须的。

你可以看原例中小甲鱼老师的用法,他返回的值都带着self。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 10:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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