回答

收藏

静态方法和类方法的区别

技术问答 技术问答 289 人阅读 | 0 人回复 | 2023-09-11

用@staticmethod装饰功能和装饰功能有什么区别?@classmethod?
6 ]9 l' h. m% N# ]" h! D, _+ Y                                                                - V; W: d. n0 R$ v
    解决方案:                                                                6 r3 q* u6 }' x9 S, k" s
                                                                也许有些示例代码会有帮助:注意:foo,class_foo和调用签名的区别static_foo:
" U1 `6 s+ g& @" @$ j
    class A(object):    def foo(self,x):        print(f"executing foo({self},{x})")    @classmethod    def class_foo(cls,x):        print(f"executing class_foo({cls},{x})")    @staticmethod    def static_foo(x):        print(f"executing static_foo({x})")a = A(), ^* \1 E4 ]' c; l5 ^! }
以下是调用对象实例的常用方法。对象实例 ,a作为第一个参数的隐藏传输。
5 R0 p5 b+ ^" |+ \2 k6 q/ f& U
    a.foo(1)# executing foo(,1)
    * p+ J4 l2 z- e' `
使用 classmethods,对象实例的类作为第一个参数隐式传输,而不是self.
! K" z, V# \7 [: J" |0 L! e/ {
    a.class_foo(1)# executing class_foo(,1)
    5 G: z- g5 o5 @+ W
您也可以class_foo使用此类调用。事实上,如果你把某物定义为一种方法,那可能是因为你计划从类而不是从类实例中调用它。A.foo(1)会引起 TypeError,但A.class_foo(1)正常工作:; w7 {" C9 V6 H
    A.class_foo(1)# executing class_foo(,1)
    + D8 k2 ]3 o3 o
使用 staticmethods,self(对象实例)和cls(类)不会作为第一个参数隐藏传输。它们的行为类似于普通函数,但你可以从实例或类中调用它们:
8 E1 f8 @$ ]" b# N
    a.static_foo(1)# executing static_foo(1)A.static_foo('hi')# executing static_foo(hi)
    3 K  o  _  Z3 J2 K. R( _3 M/ j
静态方法用于分组与类有一定逻辑联系的函数。0 }8 Q/ T: h& R3 K
foo只是一个函数,但当你调用它时,你a.foo不仅会获得函数,还会获得函数的部分应用版本,并对象实例a绑定到函数的第一个参数。foo 2 参数,a.foo只需要 1 参数。
- x1 o) r# R- Y2 o% d) e* ha绑定到foo. 这就是以下绑定一词的含义:
; |9 N( T" R4 a) g  }$ W4 {) P0 x
    print(a.foo)# >0 O* Y" e* `- U* ^
与a.class_foo,a不是绑定到class_foo,而是类A绑定到class_foo。
7 F* N& G2 c5 e9 u2 D! z8 J4 X/ G
    print(a.class_foo)# >
    / z& u/ I7 _$ Q5 H; A" i. L' ?
这里使用静态方法,即使是一种方法a.static_foo回到一个没有参数绑定的好 ‘ole 函数。static_foo期待 1 参数, a.static_foo期望 1 参数。
& q- A( Z  m% E+ y; e) |$ v# e
    print(a.static_foo)# 8 b7 Y+ y! I' _# C
当然,当你改变的时候static_foo同样的事情发生在与班级交谈时。A。0 A4 g  y; S# r2 d0 `( k# n
    print(A.static_foo)#
    % |0 e% h' N0 [$ Q2 J5 X7 g! e+ z5 C
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则