@staticmethod,@classmethod与cls
Python实例方法:
def hello(self): pass
Pyhton类方法:
@classmethod def hello(cls): pass
self所代表的其实是对象的指针,它可以指向任意一个对象。在实例化对象的时候self就会变成对象实例。
cls所代表的东西代表的其实是一个类本身,它可以用来调用类自己的属性和类自己的方法。
cls代表类本身而self是对象的指针
比较一般类方法中的self和cls的区别:一般来说,使用某个类的方法,需要先将类实例化,赋予一个对象才可以调用类中的方法,但是如果使用了@staticmethod 或@classmethod,就可以不用实例化,直接类名.方法名()来调用。这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
使用实例:
from dataclasses import dataclass, field from typing import Any @dataclass class Hello(): a = 1 def __init__(self, b=2, c=3): self.b = b self.c = c def h1(self): print('hello h1') print("b:{},c:{}".format(self.b, self.c)) @classmethod def h2(cls): print('hello h2') print(cls.a) ##获取类的属性a cls().h1() ##获取类的方法 cls(4, 5).h1() ##获取类的方法,并初始化参数 return cls(7,8) @staticmethod def h3():##不需要cls print("hello h3") if __name__ == "__main__": hello = Hello() print("+"*20,'hello','+'*20)##对象调用 hello2 = hello.h2() print("+" * 20, 'hello2', '+' * 20)##类调用 hello2.h2() print("+" * 20, 'hello3', '+' * 20)##类调用 hello2.h3() pass
输出:
++++++++++++++++++++ hello ++++++++++++++++++++ hello h2 1 hello h1 b:2,c:3 hello h1 b:4,c:5 ++++++++++++++++++++ hello2 ++++++++++++++++++++ hello h2 1 hello h1 b:2,c:3 hello h1 b:4,c:5 ++++++++++++++++++++ hello3 ++++++++++++++++++++ hello h3