今天又起雾了 发表于 2020-8-28 22:17:26

37讲

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   为什么参数随便写都能调用,,,这个参数代表标识吗?

sunrise085 发表于 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这个属性

myheartflyhigh 发表于 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”不是变量了,可以直接引用

今天又起雾了 发表于 2020-9-4 16:23:04

sunrise085 发表于 2020-8-28 23:20
你这两个问题实际上是一个问题
你的困惑就是这个self是什么东西呗



谢谢大佬,最近耽误了学习,继续努力

今天又起雾了 发表于 2020-9-4 16:23:40

myheartflyhigh 发表于 2020-8-30 10:35
问题1
TypeError: myFun() missing 1 required positional argument: 'self'   开始调用说没有self报 ...

谢谢鱼友
页: [1]
查看完整版本: 37讲