回答

收藏

静态方法和类方法的区别

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

用@staticmethod装饰功能和装饰功能有什么区别?@classmethod?9 p2 `" @3 V5 V- _& `, l
                                                                & @! y  e% u; |' ~5 ]
    解决方案:                                                                # [0 j3 X- X; L1 B7 b
                                                                也许有些示例代码会有帮助:注意:foo,class_foo和调用签名的区别static_foo:* q% ]" H: [( R1 Q  C. q: q6 b
    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()
    , b3 w8 o4 r  e- R
以下是调用对象实例的常用方法。对象实例 ,a作为第一个参数的隐藏传输。  J/ J" b0 L% P* P
    a.foo(1)# executing foo(,1)5 O. W2 a* }7 _: W" Y& k( d
使用 classmethods,对象实例的类作为第一个参数隐式传输,而不是self.  `" R2 N$ G) O1 \: ]7 `
    a.class_foo(1)# executing class_foo(,1)" i. k; t5 f! @& @( \$ w- H# b; Y
您也可以class_foo使用此类调用。事实上,如果你把某物定义为一种方法,那可能是因为你计划从类而不是从类实例中调用它。A.foo(1)会引起 TypeError,但A.class_foo(1)正常工作:
3 P/ p9 j6 x, s
    A.class_foo(1)# executing class_foo(,1)
    7 A* R; D0 q4 N1 g+ \. E, h
使用 staticmethods,self(对象实例)和cls(类)不会作为第一个参数隐藏传输。它们的行为类似于普通函数,但你可以从实例或类中调用它们:
2 j8 v+ j9 V4 V* X5 o0 m
    a.static_foo(1)# executing static_foo(1)A.static_foo('hi')# executing static_foo(hi)
    2 d& Q$ p( d' p9 z( q1 `; {
静态方法用于分组与类有一定逻辑联系的函数。
4 y' I* g: t, x5 o+ Z1 tfoo只是一个函数,但当你调用它时,你a.foo不仅会获得函数,还会获得函数的部分应用版本,并对象实例a绑定到函数的第一个参数。foo 2 参数,a.foo只需要 1 参数。4 i3 [- ?3 J" P% h' I( u$ Z
a绑定到foo. 这就是以下绑定一词的含义:' O4 z; T( [' `# T2 V. s
    print(a.foo)# >. L  N; a0 p% @/ `) }  h
与a.class_foo,a不是绑定到class_foo,而是类A绑定到class_foo。
% i% t- j" Y1 K. Z+ N/ K
    print(a.class_foo)# >
    $ ?3 y5 G1 X" N. M7 K; g
这里使用静态方法,即使是一种方法a.static_foo回到一个没有参数绑定的好 ‘ole 函数。static_foo期待 1 参数, a.static_foo期望 1 参数。
& ]  ]5 B& |# G1 w# \$ {; |. m
    print(a.static_foo)# 9 J/ \7 e0 S0 }0 y: d! W# G
当然,当你改变的时候static_foo同样的事情发生在与班级交谈时。A。
& i, d; O3 g  g% m1 n
    print(A.static_foo)#
    6 v! C# w7 ?& p
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则