鱼C论坛

 找回密码
 立即注册
查看: 532|回复: 9

[已解决]037课后题

[复制链接]
发表于 2018-8-17 17:25:53 | 显示全部楼层 |阅读模式

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

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

x
第一种
class Piaojia:

    def piaojia(self,z,x = 100,y = 50):
        self.x = x
        self.y = y
        if z == '周末':
            return (self.x * 2 + self.y)*1.2
        if z == '平日':
            return self.x * 2 + self.y

第二种
class Piaojia:

    def piaojia(self,z,x = 100,y = 50):

        if z == '周末':
            return (x * 2 + y)*1.2
        if z == '平日':
            return x * 2 + y

这两种我都可以正确的运行处程序来,那我为什么要使用
        self.x = x
        self.y = y
两个语句,他的作用是什么,相对第二种有什么好处,求大神指导
最佳答案
2018-8-17 17:28:03
本帖最后由 无符号整形 于 2018-8-17 17:36 编辑

self.x = x就是把这个类一个已经实例化了的对象的x属性设成参数x(也就是说,假如我p = Piaojia()(实例化对象),然后调用piaojia(),那么第一种可以通过p.x、p.y来访问x,y参数的值(记录了下来),而第二种则不行)
self.y = y同理。
另:其实还是不一样的,第二个不同没有设置类属性(简单说就是类里面的变量)
另外第一个类属性x,y都已经等于参数x,y的值了,所以两种用法都一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-17 17:27:39 | 显示全部楼层
self.x是为了你实例后能访问,并被自身的函数调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 17:28:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 无符号整形 于 2018-8-17 17:36 编辑

self.x = x就是把这个类一个已经实例化了的对象的x属性设成参数x(也就是说,假如我p = Piaojia()(实例化对象),然后调用piaojia(),那么第一种可以通过p.x、p.y来访问x,y参数的值(记录了下来),而第二种则不行)
self.y = y同理。
另:其实还是不一样的,第二个不同没有设置类属性(简单说就是类里面的变量)
另外第一个类属性x,y都已经等于参数x,y的值了,所以两种用法都一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-17 19:12:01 | 显示全部楼层
无符号整形 发表于 2018-8-17 17:28
self.x = x就是把这个类一个已经实例化了的对象的x属性设成参数x(也就是说,假如我p = Piaojia()(实例化 ...

就是说如果我换一种方法写也是成立的
class Piaojia:

    def piaojia(self,z,x = 100,y = 50):
        self.e = x
        self.h = y

        if z == '周末':
            return (self.e * 2 + self.h)*1.2
        if z == '平日':
            return self.e * 2 + self.h

所以问题中的        self.x  ,  self.y 和我def piaojia(self,z,x = 100,y = 50):中的x,y没有关系,一个是属性,一个是参数,这样就可以通过这个函数访问参数x,y的值,而如果是第一种的话因为它是局部变量外面不能访问的到对吧
        
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 19:38:33 | 显示全部楼层
15524866535 发表于 2018-8-17 19:12
就是说如果我换一种方法写也是成立的
class Piaojia:

嗯,对的
不过那个不是局部变量,类就像是一个模板,实例化对象就是一块原材料造出来的东西,类可以把一大块原材料变成一个工艺品。
那个外面可以访问的。
类就是一种特殊的数据结构,里面有变量(属性),有函数(方法),可以随便使用,十分方便。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 20:06:24 | 显示全部楼层
无符号整形 发表于 2018-8-17 19:38
嗯,对的
不过那个不是局部变量,类就像是一个模板,实例化对象就是一块原材料造出来的东西,类可以把一 ...

在前边不是讲过 在函数里面定义的参数是局部变量,出了这个函数是无效的吗,python在运用这个函数的时候,用栈存储,用完时栈存储的东西自动删除
比如说我这样写
class Piaojia:
    def ertong(self,x = 50):
        self.x = x
        return self.x
    def chengren(self,y =100):
        self.y = y
        return self.y
    def jiage(self,z):
        if z == '周末':
            return (self.x + self.y *2)*1.2
        else:
            return self.x + self.y * 2

就会提示Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    t1.jiage('周末')
  File "/Users/a123/Documents/实验.py", line 10, in jiage
    return (self.x + self.y *2)*1.2
AttributeError: 'Piaojia' object has no attribute 'x' ////'Piaojia'对象没有属性'x'

这个错误不是因为  jiage 函数不能直接运用self.x 和 self.y吗 ?求指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-17 20:09:20 | 显示全部楼层
15524866535 发表于 2018-8-17 20:06
在前边不是讲过 在函数里面定义的参数是局部变量,出了这个函数是无效的吗,python在运用这个函数的时候 ...

对呀。
self.xxx指的是设置类(模板)的属性,这个属性由类拥有,函数只是设置。

点评

其实用self.xxx是因为这个变量是在类中的  发表于 2018-8-17 20:10
所以访问这些变量时为了以示与普通变量的区别,使用self.xxx来访问  发表于 2018-8-17 20:09
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-17 20:13:25 | 显示全部楼层
无符号整形 发表于 2018-8-17 20:09
对呀。
self.xxx指的是设置类(模板)的属性,这个属性由类拥有,函数只是设置。

太感谢了,这次真的懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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