鱼C论坛

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

[已解决]定义‘类’的过程中,用‘方法’改变‘属性’值(第36讲动动手1)

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

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

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

x
大家好! 请教大家一个问题。
在定义Rectangle类的时候,用方法 setRect(self) 改变self.length和self.width的值。可是self.length和self.width属于setRect(self)的局部变量,为什么在不声明nonlocal或者global的前提下也可以改变length和width的值呢? 谢谢大家!!!
此题来自【第36讲 动动手1】

class Rectangle:
    length = 5
    width = 4
   
    def setRect(self):
        print("请输入矩形的长和宽...")
        self.length = float(input('长:'))
        self.width = float(input('宽:'))

    def getRect(self):
        print('这个矩形的长是:%.2f,宽是:%.2f' % (self.length, self.width))
        
    def getArea(self):
        return self.length * self.width
最佳答案
2020-5-22 08:42:26
本帖最后由 Twilight6 于 2020-5-22 09:07 编辑

类中带self的变量称为实例变量


在类中的方法外的变量称为 类变量


在方法中没带 self 的变量才是局部变量


实例变量作用域整个类的命名空间,不需要nonlocal和global来再次声明


楼主你是没有区分好各种变量到底是声明建议看下我整理的笔记:


类、实例、局部变量


如果帮助到你了~那就给个最佳吧~

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

使用道具 举报

发表于 2020-5-22 07:20:21 | 显示全部楼层
self.length和self.width不是class Rectangle 实例化后的后的实例对象绑定属性吗?
而且这个函数就传入了self了呀,你要是不传入self用nonlocal也没用吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 07:42:36 | 显示全部楼层
本帖最后由 动物园的狒狒 于 2020-5-22 12:59 编辑
沐羽尘 发表于 2020-5-22 07:20
self.length和self.width不是class Rectangle 实例化后的后的实例对象绑定属性吗?
而且这个函 ...


看完37讲明白了。
一旦self.length或者self.xxx这些【实例变量】一旦被定义了,在整个class里就都通用了。【我的地盘听我的】只使用于函数的【局部变量】,不适用于【实例变量】。比如rect.length一旦在setRect里被定义了,那么rect.length在getRect()和getArea()里都能被看见。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 07:44:06 | 显示全部楼层
不太明白你想表达什么。

类定义的时候,只有在实例化的时候,才开辟内存用来存储内容,调用完销毁。

你只定义的话,它是不影响你使用全局命名空间的,不影响的话,你内部定义的东西在调用前都不存在。

调用的话,只需传入实例self就行了,跟局部变量全局变量没啥关系。

不要跟函数弄混了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 08:42:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-5-22 09:07 编辑

类中带self的变量称为实例变量


在类中的方法外的变量称为 类变量


在方法中没带 self 的变量才是局部变量


实例变量作用域整个类的命名空间,不需要nonlocal和global来再次声明


楼主你是没有区分好各种变量到底是声明建议看下我整理的笔记:


类、实例、局部变量


如果帮助到你了~那就给个最佳吧~

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

使用道具 举报

发表于 2020-5-22 08:53:47 | 显示全部楼层
类的函数setRect有参数传入,参数self就是类实例化对象的代称,因此不需要再用global或nonlocal声明其是不是本地对象,因为这俩是类实例化对象的成员变量,不是局部成员,也不是外部变量。

另外,你的程序中定义了length、width,还有self.length和self.width,这两组是不一样的
前者是类变量,属于类的属性,与实例化对象无关,后者是实例变量,会随着不同的类对象而改变。
类变量在任何地方都可以使用,使用方法:类名.变量名,这里就是Rectangle.length
实例变量在类内实例成员函数中使用,self.变量名,在类外使用之前必须现有实例化类对象,类对象.变量名
class Rectangle:
    length = 5
    width = 4
    def setRect(self):
        print("请输入矩形的长和宽...")
        self.length = float(input('长:'))
        self.width = float(input('宽:'))
    def getRect(self):
        print('这个矩形的长是:%.2f,宽是:%.2f' % (self.length, self.width))
    def getArea(self):
        return self.length * self.width
        
a=Rectangle()
a.setRect()
print(Rectangle.length)#这个打印出来的是5
print(a.length)#这个打印出来的是调用a.setRect()时,你输入的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 13:06:57 | 显示全部楼层
heidern0612 发表于 2020-5-22 07:44
不太明白你想表达什么。

类定义的时候,只有在实例化的时候,才开辟内存用来存储内容,调用完销毁。

又学到了程序运行的原理。非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 13:08:50 | 显示全部楼层
Twilight6 发表于 2020-5-22 08:42
类中带self的变量称为实例变量


在类中的方法外的变量称为 类变量

感谢资深鱼油的回答!
仔细认真的拜读了你整理的笔记,在解决了我的疑问之后,又学到了很多宝贵的知识。
非常的感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 13:11:17 | 显示全部楼层
动物园的狒狒 发表于 2020-5-22 13:08
感谢资深鱼油的回答!
仔细认真的拜读了你整理的笔记,在解决了我的疑问之后,又学到了很多宝贵的知识。 ...

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

使用道具 举报

 楼主| 发表于 2020-5-22 13:12:40 | 显示全部楼层
sunrise085 发表于 2020-5-22 08:53
类的函数setRect有参数传入,参数self就是类实例化对象的代称,因此不需要再用global或nonlocal声明其是不 ...

非常感谢你的回答!非常清晰明了!要不是管理员的超级笔记,你就是最佳答案啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 02:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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