你这两个问题实际上是一个问题
你的困惑就是这个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这个属性
复制代码