动物园的狒狒 发表于 2020-5-22 05:54:46

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

大家好! 请教大家一个问题。
在定义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 07:20:21

self.length和self.width不是class Rectangle 实例化后的后的实例对象绑定属性{:10_257:}吗?
而且这个函数就传入了self了呀,你要是不传入self用nonlocal也没用吧{:10_254:}

动物园的狒狒 发表于 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()里都能被看见。

heidern0612 发表于 2020-5-22 07:44:06

不太明白你想表达什么。

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

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

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

不要跟函数弄混了。

Twilight6 发表于 2020-5-22 08:42:26

本帖最后由 Twilight6 于 2020-5-22 09:07 编辑

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

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

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

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

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

类、实例、局部变量

如果帮助到你了~那就给个最佳吧~{:10_288:}

sunrise085 发表于 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()时,你输入的值

动物园的狒狒 发表于 2020-5-22 13:06:57

heidern0612 发表于 2020-5-22 07:44
不太明白你想表达什么。

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


又学到了程序运行的原理。非常感谢!

动物园的狒狒 发表于 2020-5-22 13:08:50

Twilight6 发表于 2020-5-22 08:42
类中带self的变量称为实例变量

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


感谢资深鱼油的回答!
仔细认真的拜读了你整理的笔记,在解决了我的疑问之后,又学到了很多宝贵的知识。
非常的感谢!

Twilight6 发表于 2020-5-22 13:11:17

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

{:10_297:}能帮助到你 我很高兴

动物园的狒狒 发表于 2020-5-22 13:12:40

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

非常感谢你的回答!非常清晰明了!要不是管理员的超级笔记,你就是最佳答案啦!
页: [1]
查看完整版本: 定义‘类’的过程中,用‘方法’改变‘属性’值(第36讲动动手1)