鱼C论坛

 找回密码
 立即注册
查看: 931|回复: 6

[已解决]关于self在类中作用问题。

[复制链接]
发表于 2019-3-21 10:25:23 | 显示全部楼层 |阅读模式

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

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

x
听了小甲鱼的课程后,大概对类中self的绑定作用有了一定了解。可是还是有一点困惑。我对self 的作用的理解是:self一个作用是用于类之间变量传递的。
比如:
class Ball:
        def setName(self, name):
                self.name = name
        def kick(self):
                print ("Hi I will %s" % self.name)
在这个类对象中,如果不用self,那么name这个变量无法传递。
class Ball1:
        def setName(self, name):
                name
        def kick(self):
                print ("Hi I will %s" % name)
在这个类中,kick无法被调用。
我的问题有二。1.如果不涉及变量在类内的传递,比如
class Ball2:                                                                               
        def setName(self, name):
                print(name)
class Ball3:
        def setName(self, name):
                self.name = name
                print(self.name)
那么这两个类是否完全等效,即self在这个类的实例化中没有用处?
2.若令b2 =  Ball2
为什么b2这个实例对象中中,hasattr(b2, name)会显示False。即b2没有name这个属性。是因为我之前对(self.属性)这个的理解有误吗?
感谢各位大佬


最佳答案
2019-3-21 10:28:43
1 并不等效,你可以这样理解,加了self的变量其作用域变成了整个类,所以可以在其他函数中直接使用该变量

2 正是加了self才表明这是这个类成员的一个属性,否则只是一个局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-21 10:28:43 | 显示全部楼层    本楼为最佳答案   
1 并不等效,你可以这样理解,加了self的变量其作用域变成了整个类,所以可以在其他函数中直接使用该变量

2 正是加了self才表明这是这个类成员的一个属性,否则只是一个局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-3-21 10:36:03 | 显示全部楼层
self就是类自身,拿你上面的例子给你解释:
  1. class Ball:
  2.         def setName(self, name):
  3.                 self.name = name        #name是方法setName内的传入数,假如你想调用类的属性,那就是Ball.name,在类自身里面就是self.name,所以self.name = name就是把Ball的name属性设置为传入的name值。
  4.         def kick(self):
  5.                 print ("Hi I will %s" % self.name)     #这里同理,你用了self.name就是调用了类自身的name属性,如果不加self,就是调用方法内的变量name,但是你没有定义,所以会出错。
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-21 10:46:20 | 显示全部楼层
self.xx=xxx才将传进来的xxx给实例xx属性,你最开始的name无法调用是很自然的,name只出现在setName里,没有出现在你调用的函数参数里,显然程序不会知道你的name是个什么,这是函数那里的知识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 13:54:43 | 显示全部楼层
BngThea 发表于 2019-3-21 10:28
1 并不等效,你可以这样理解,加了self的变量其作用域变成了整个类,所以可以在其他函数中直接使用该变量
...

感谢感谢。简明易懂!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 13:55:26 | 显示全部楼层
风丶少 发表于 2019-3-21 10:36
self就是类自身,拿你上面的例子给你解释:

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

使用道具 举报

 楼主| 发表于 2019-3-21 13:58:21 | 显示全部楼层
塔利班 发表于 2019-3-21 10:46
self.xx=xxx才将传进来的xxx给实例xx属性,你最开始的name无法调用是很自然的,name只出现在setName里,没 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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