回答

收藏

静态方法和类方法的区别

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

用@staticmethod装饰功能和装饰功能有什么区别?@classmethod?
: Q' c1 D+ Q2 z$ @                                                                " O2 u; W2 k* [4 [0 |) \+ c
    解决方案:                                                               
# M* ^7 m7 a# K) B6 G+ E+ x- ]                                                                也许有些示例代码会有帮助:注意:foo,class_foo和调用签名的区别static_foo:
/ ?, R/ T% Y; p
    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()( N5 p3 g, F1 `0 \" B, m. x
以下是调用对象实例的常用方法。对象实例 ,a作为第一个参数的隐藏传输。
' [1 k$ }& t* ], y6 M+ j) ^" p& w1 q
    a.foo(1)# executing foo(,1)
    , ?# {3 P6 F/ Z% `5 i( r! z/ E/ N+ ?
使用 classmethods,对象实例的类作为第一个参数隐式传输,而不是self.
! T+ c0 Z7 b/ j  q" @
    a.class_foo(1)# executing class_foo(,1)
    # }7 w4 P4 s9 l) Q: O- U
您也可以class_foo使用此类调用。事实上,如果你把某物定义为一种方法,那可能是因为你计划从类而不是从类实例中调用它。A.foo(1)会引起 TypeError,但A.class_foo(1)正常工作:
' i0 ^' Z! b8 h& e  q
    A.class_foo(1)# executing class_foo(,1)/ f. r9 U) W5 c6 ]+ r) V# H2 i
使用 staticmethods,self(对象实例)和cls(类)不会作为第一个参数隐藏传输。它们的行为类似于普通函数,但你可以从实例或类中调用它们:
% w+ Q" X, a# p0 s1 h/ ], U
    a.static_foo(1)# executing static_foo(1)A.static_foo('hi')# executing static_foo(hi)# [; D. @& D& x: F+ U! n3 l* ]4 M
静态方法用于分组与类有一定逻辑联系的函数。3 q2 Y" `6 p* H. m4 V3 W( I. C/ D
foo只是一个函数,但当你调用它时,你a.foo不仅会获得函数,还会获得函数的部分应用版本,并对象实例a绑定到函数的第一个参数。foo 2 参数,a.foo只需要 1 参数。
! F# }: o- j* S$ f: a0 f. \7 `a绑定到foo. 这就是以下绑定一词的含义:7 O, k' H* q# c' G$ |! B) q/ Y
    print(a.foo)# >. v% {1 ~, n5 W6 U$ T( N
与a.class_foo,a不是绑定到class_foo,而是类A绑定到class_foo。
# J! t. R+ d: C0 I; x" m
    print(a.class_foo)# >9 R3 ^( E1 r* Z
这里使用静态方法,即使是一种方法a.static_foo回到一个没有参数绑定的好 ‘ole 函数。static_foo期待 1 参数, a.static_foo期望 1 参数。& e; i; s1 p2 {# g; l- n! s
    print(a.static_foo)#
    ; R/ F' ~3 [3 V9 I7 R
当然,当你改变的时候static_foo同样的事情发生在与班级交谈时。A。/ \3 `4 Q  S+ T' B4 \# t
    print(A.static_foo)# 2 C& w# C( q4 V
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则