区别
方法在类体中定义的函数。如果作为该类实例的一个属性被调用,该方法将获得实例对象作为它的第一个参数(通常称为self)。请参阅函数和嵌套作用域函数向调用者返回某个值的一系列语句。它也可以传递零个或多个参数,这些参数可用于主体的执行。[请参方法]
实例方法
定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
调用:只能由实例对象调用。
类方法
定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
调用:类和实例对象都可以调用。类方法是只与类本身有关而与实例无关的方法。通过cls引用的必定是类对象的属性和方法,不能访问实例属性,能够通过实例对象和类对象去访问类方法
静态方法
定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
调用:类和实例对象都可以调用。静态方法中引用类属性的话,必须通过类对象来引用,不能访问实例属性
案例:
下面包含了上述三种方法和未声明的方法
class myW2:
@staticmethod
def staticMeth():
print(1141)
def selfMeth(self):
print(111)
def unDefind():
print(111)
@classmethod
def classMeth(cls):
myW2.unDefind()
print(22)
a= myW2()
print(a.selfMeth)
print(a.staticMeth)
print(myW2.staticMeth)
print(a.classMeth)
print(a.unDefind)
print(myW2.unDefind)
最后输出的unDefind方法信息为啥会不同能,可能是解释器解读调用者来默认决定为什么类型吧。当使用类来调用未定义的方法时,解释器是不会报错的但是pycharm编辑器会提示错语法错误。
再看看idle 执行未定义的方法:
>>> class O():
def p():
print(11)
>>> O.p()
11
>>> a=O()
>>> a.p()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
a.p()
TypeError: p() takes 0 positional arguments but 1 was given
>>> print(a.p)
<bound method O.p of <__main__.O object at 0x000001EA11D63190>>
>>> print(O.p)
<function O.p at 0x000001EA0FD88A60>
初学者,没看到过这种函数的写法,不知道是不是py不足还是我学漏了,请大佬们指教。