鱼C论坛

 找回密码
 立即注册
查看: 767|回复: 4

求助各位大佬,第37课,课后题有点疑惑

[复制链接]
发表于 2020-2-5 22:45:41 | 显示全部楼层 |阅读模式

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

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

x
求大神看下,小甲鱼的答案如下
不明白在定义self.x的时候为什么不直接用r.randint(0,10)呢,下面检查移动是都超出边界的时候为什么用这个公式呢?能不能用10-(new_x-10)代替呢?
最后一个不过也很重要的问题,__init__(self)是在定制初始化方案,这个怎么更好的理解呢?

import random as r
legal_x=[0,10]
legal_y=[0,10]
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])
        #检查移动是否超出场景边界
        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
                        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-5 22:52:06 | 显示全部楼层
class Box:
#def setDimension(self, width, height, depth):
# self.width = width
# self.height = height
# self.depth = depth
def __init__(self, width, height, depth):
self.width = width
self.height = height
self.depth = depth
或者这样子的两个定义的区别在哪里呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 23:54:42 | 显示全部楼层
这样写是为了通用性,如果需要改变池子大小,比如改成20*20,10*5,等等,只需要修改legal_x、legal_y的赋值,不需要在程序里面一个一个去修改了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-6 11:07:04 | 显示全部楼层
txxcat 发表于 2020-2-5 23:54
这样写是为了通用性,如果需要改变池子大小,比如改成20*20,10*5,等等,只需要修改legal_x、legal_y的赋 ...

明白了,大佬能帮忙看下关于init的问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 19:07:45 | 显示全部楼层
__init__(self)
构造方法:只要实例化一个对象,那么这个方法就会在对象被创建时,自动调用。


类代表了一类事物,这一类事物有一系列的属性,当你在特指某个类的特定对象时,需要为他的这些属性设定具体的值。这就是init的工作。举个例子,假如你创建了一个"人类",那么每个人都有的属性可能有什么呢,最简单的,姓名,身高,体重,身份证号,出生年月。
当你在特指人类的某个特定对象,编程中叫实例化,这里就是你创造一个具体的人,那么这个人的,姓名,身高,体重,身份证号,出生年月都得有具体的值,init就是帮你为每类事物的特定对象初始化这些属性值的。

引用__init__     好像就不用每次让新的对象去=Ball()了  ,新对象可以直接调用Ball()中的函数。====>

class Ball:
        def __init__(self,name):
                self.mingzi=name
        def kick(self):       
                print('我叫%s,谁在踢我?' % self.mingzi)

a=Ball("足球")    #def __init__(self,name):中的,self,自动传给a,name变量是传入的参数
a.kick()

b=Ball('土豆')
b.kick()

c=Ball('西瓜')
c.kick()

同一个程序不引用__init__ 的区别:  ====>

class Ball:
        def eachball(self,name):
                self.mingzi=name
        def kick(self):       
                print('我叫%s,谁在踢我?' % self.mingzi)

a=Ball()
a.eachball('足球')  
a.kick()

b=Ball()
b.eachball('土豆')
b.kick()

c=Ball()
c.eachball('西瓜')
c.kick()

纯新手的理解,不知对不对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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