合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
- 实例方法: - 第一个参数代表 实例本身,强制必须,惯例cls - 操作/修改的是 实例属性 - 仅实例能调用 - 类方法: - 第一个参数代表 类本身,强制必须,惯例cls - 操作/修改的是 类属性(即使是实例调用) - 类、实例均能调用 - 静态方法: - 正常参数 - 无法操作任何属性 - 类、实例均能调用 - 类静态函数: - 正常参数 - 无法操作任何属性 - 类、实例均能调用 ~~~ class Cls: def instance_method(self, *args, **kwargs): pass @classmethod def class_method(cls, *args, **kwargs): pass @staticmethod def static_method(*args, **kwargs): pass def static_func(*args, **kwargs): pass # 当然也可以不使用装饰器@语法糖创建 类方法、静态方法 def a(cls, *args, **kwargs): pass a = classmethod(a) def b(*args, **kwargs): pass b = staticmethod(b) ins = Cls() # 调用 实例方法 ins.instance_method() # 调用 类方法 ins.class_method() Cls.class_method() ins.a() Cls.a() # 调用 静态方法 ins.static_method() Cls.static_method() ins.b() Cls.b() # 调用 静态函数 Cls.static_func() ins.static_func() ~~~ 静态方法 vs 静态函数 ------------- 两者其实就是所属对象命名空间下的普通函数,不能操作类的任何属性。通常用来定义一些和类主题相关的函数。 - 类外:均能被 类/实例 调用 - 类内: - 初始化类属性时:可以调用静态函数,不能调用静态方法 - 类/实例方法中:均能通过 self 或 cls 调用 - 静态方法/函数中:均不能调用 产生的疑问:`@staticmethod`有什么用? 能用静态方法的地方都可以用静态函数代替,相反却不成立(初始化类属性时)。 ~~~ class Cls: def instance_method(self, *args, **kwargs): self.static_method() self.static_func() pass @classmethod def class_method(cls, *args, **kwargs): cls.static_method() cls.static_func() pass @staticmethod def static_method(*args, **kwargs): #static_func() # NameError: name 'static_func' is not defined pass def static_func(*args, **kwargs): #static_method() # NameError: name 'static_method' is not defined #static_func1() # NameError: name 'static_func1' is not defined pass def static_func1(*args, **kwargs): pass # classmethod staticmethod 本质就是两个预定义的静态函数 def a(cls, *args, **kwargs): pass a = classmethod(a) def b(*args, **kwargs): pass b = staticmethod(b) #c = static_method() # TypeError: 'staticmethod' object is not callable d = static_func() ins = Cls() # 调用 实例方法 ins.instance_method() # 调用 类方法 ins.class_method() Cls.class_method() ins.a() Cls.a() # 调用 静态方法 ins.static_method() Cls.static_method() ins.b() Cls.b() # 调用 静态函数 Cls.static_func() ins.static_func() ~~~ 观测属性变化 ------ **以下内容可以忽略不看,都是废话** 添加观测属性变化的代码: ~~~ class Cls: p1, p2 = 'a', 'b' def instance_method(self, *args, **kwargs): self.p1 = self.p1.upper() @classmethod def class_method(cls, *args, **kwargs): cls.p2 = cls.p2.upper() @staticmethod def static_method(*args, **kwargs): pass def class_static_func(*args, **kwargs): pass # 当然也可以不使用装饰器@语法糖创建 类方法、静态方法 def a(cls, *args, **kwargs): cls.p2 = cls.p2.upper() a = classmethod(a) def b(*args, **kwargs): pass b = staticmethod(b) ins = Cls() ins.p1, ins.p2 = 'aa', 'bb' print(Cls.p1, ins.p1, Cls.p2, ins.p2) # a aa b bb -- 均小写 # 实例方法 ins.instance_method() print(Cls.p1, ins.p1) # a AA -- 修改 实例属性 # 类方法 ins.class_method() Cls.class_method() ins.a() Cls.a() print(Cls.p2, ins.p2) # B bb -- 修改 类属性 # 静态方法 ins.static_method() Cls.static_method() ins.b() Cls.b() # 类静态方法 Cls.class_static_func() ~~~