鱼C论坛

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

[已解决]37讲

[复制链接]
发表于 2020-8-28 22:17:26 | 显示全部楼层 |阅读模式

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

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

x
class MyClass:

        name = 'FishC'
        def myFun(self):
                print("Hello FishC")

>>> MyClass.myFun(self)
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    MyClass.myFun(self)
NameError: name 'self' is not defined
>>> MyClass.myFun("self")
Hello FishC
>>> MyClass.myFun("sf")
Hello FishC

求助大佬,
问题1
MyClass.myFun()
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    MyClass.myFun()
TypeError: myFun() missing 1 required positional argument: 'self'     开始调用说没有self  报错后写入
MyClass.myFun(self)
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    MyClass.myFun(self)
NameError: name 'self' is not defined    为什么传入参数self  报错,因为参数必须加双引号吗?????
问题2
MyClass.myFun("self")
Hello FishC
>>> MyClass.myFun("sf")
Hello FishC     为什么参数随便写都能调用,,,这个参数代表标识吗?
最佳答案
2020-8-28 23:20:51
你这两个问题实际上是一个问题
你的困惑就是这个self是什么东西呗

给你写的类加点东西,方便将这个问题讲清楚
class MyClass:
    name = 'FishC'
    
    def myFun(self):
        print("Hello FishC")
        
    def fun2(self):
        print(self.name)
现在这个类有两个方法,第一个方法没有用到self这个参数,第二个方法用到了self这个参数,写的是self.name

我们先说第一个方法,myFun(self),这个方法有一个参数,但是参数有什么意义不确定。那么这个方法也就不确定到底是类方法,还是类实例方法了。
若当做类方法,也就是你的这种调用方式:类名.方法名,那么self就是一个一般参数,就必须要传参数,但是参数是什么都无所谓,因为方法内没有用到该参数,所以对该参数没有任何要求;
若当做实例方法,那么调用方式:实例名.方法名,也就是需要先对该类实例化,然后用实例调用方法,这是self就是实例对象了,就不用传参数了

在来说第二个方法,fun2(self),这个方法也有一个参数self,这个参数已经固定了,因为在方法中有使用到self.name,所以self是一个该类的实例化对象,或者一个有name属性的对象。一般会被当做类实例方法,当然也可以当做类方法
若当做类方法,那么对self参数就有一定的要求,需要有name属性,否则就会报错;
若当做实例方法,那么就不用传参了,直接实例名.方法名
a=MyClass()
a.myFun()
MyClass.myFun('hh')
MyClass.myFun(a)

a.fun2()
MyClass.fun2(a)
MyClass.fun2('hhhhh')#这个会报错,因为字符串没有name属性

class bb:
    name='这是一个测试'
MyClass.fun2(b())#这个也是可行的,因为class b有name这个属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 23:20:51 | 显示全部楼层    本楼为最佳答案   
你这两个问题实际上是一个问题
你的困惑就是这个self是什么东西呗

给你写的类加点东西,方便将这个问题讲清楚
class MyClass:
    name = 'FishC'
    
    def myFun(self):
        print("Hello FishC")
        
    def fun2(self):
        print(self.name)
现在这个类有两个方法,第一个方法没有用到self这个参数,第二个方法用到了self这个参数,写的是self.name

我们先说第一个方法,myFun(self),这个方法有一个参数,但是参数有什么意义不确定。那么这个方法也就不确定到底是类方法,还是类实例方法了。
若当做类方法,也就是你的这种调用方式:类名.方法名,那么self就是一个一般参数,就必须要传参数,但是参数是什么都无所谓,因为方法内没有用到该参数,所以对该参数没有任何要求;
若当做实例方法,那么调用方式:实例名.方法名,也就是需要先对该类实例化,然后用实例调用方法,这是self就是实例对象了,就不用传参数了

在来说第二个方法,fun2(self),这个方法也有一个参数self,这个参数已经固定了,因为在方法中有使用到self.name,所以self是一个该类的实例化对象,或者一个有name属性的对象。一般会被当做类实例方法,当然也可以当做类方法
若当做类方法,那么对self参数就有一定的要求,需要有name属性,否则就会报错;
若当做实例方法,那么就不用传参了,直接实例名.方法名
a=MyClass()
a.myFun()
MyClass.myFun('hh')
MyClass.myFun(a)

a.fun2()
MyClass.fun2(a)
MyClass.fun2('hhhhh')#这个会报错,因为字符串没有name属性

class bb:
    name='这是一个测试'
MyClass.fun2(b())#这个也是可行的,因为class b有name这个属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 10:35:29 | 显示全部楼层
本帖最后由 myheartflyhigh 于 2020-8-30 10:49 编辑

问题1
TypeError: myFun() missing 1 required positional argument: 'self'     开始调用说没有self  报错后写入
意思是缺少参数,并不是缺少self。你可以这样写 MyClass.myFun(1)。但是你写入的参数不能是一个没有定义的变量。
self不带引号的话是一个没有定义的变量,你需要对它进行定义,才能引用。self=1之后你再引用就没问题了。
另外“” 或者‘’代表的是字符串。所以‘self’或者“self”不是变量了,可以直接引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-4 16:23:04 | 显示全部楼层
sunrise085 发表于 2020-8-28 23:20
你这两个问题实际上是一个问题
你的困惑就是这个self是什么东西呗

谢谢大佬,最近耽误了学习,继续努力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-4 16:23:40 | 显示全部楼层
myheartflyhigh 发表于 2020-8-30 10:35
问题1
TypeError: myFun() missing 1 required positional argument: 'self'     开始调用说没有self  报 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 06:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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