既不使用修饰符,也不假定类或者实例调用的类方法

def func(self):
假定其第一参数是对实例的引用,调用方法时必须提供实例对象
@classmethod
def func(cls):
假定其第一参数是对类的引用,调用方法时必须提供类对象
@staticmethod
def func():
既不需要提供类对象,也不需要提供实例对象的静态方法
那如何理解既不使用修饰符,也不约定引用的类方法?

'''定义函数时既不使用修饰符,也不假定第一参数'''
class A():
    def func():
        print('hello')
A.func()
#hello
a=A()
a.func()
#func() takes 0 positional arguments but 1 was given

为什么类A调用func函数时不会默认传递类对象(cls)给函数造成错误,但是实例调用时会默认传递实例对象(self)给函数造成错误?
类作为一个对象,不会像实例一样去传递实例本身(self)吗?

在不使用修饰符
@classmethod
@staticmethod
情况下,func只是类A中的一个属性。
用类A调用func函数是将func做为一个普通函数来调用的。
做为普通函数是不会传递类对象(cls),也没有实例对象(self)可以传递。

方法加上self参数就可以了:

class A():
    def func(self):
        print('hello')
a=A()
a.func()

img

声明时

  • classmethod的第一个参数为类本身(cls),正如实例方法的第一个参数为对象本身(self);
    
  • staticmethod第一个参数不需要传入cls或self,故staticmethod中是无法访问类和对象的数据的。
    

调用时

  • 都可用类名直接调用
  • 也可用实例对象调用(不推荐,没必要)

两者特点

  • classmethod可以设置修改类属性;也可以实例化对象;
  • staticmethod无法访问类或对象的数据,所以可把它当作一个辅助功能方法用,里面包含一些与该类有关的逻辑代码。比如validate(*args)
    ————————————————
    版权声明:本文为CSDN博主「一从际发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接: https://blog.csdn.net/kaever/article/details/105808768 https://blog.csdn.net/kaever/article/details/105808768