簡體   English   中英

在同一個 Python 類中調用方法、類方法、靜態方法

[英]Calling method, classmethod, staticmethod in the same Python class

從一個著名的例子中,我了解了 Python 類中方法、類方法和靜態方法之間的區別。

來源: Python 中的 @staticmethod 和 @classmethod 有什么區別?

class A(object):
    def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)

    @classmethod
    def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)

    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)"%x   
    # My Guesses
    def My_Question(self,x):
        self.foo(x)
        A.class_foo(x)
        A.static_foo(x)

a=A()

現在我想知道,如何在類中調用方法、 @classmethod@staticmethod

我把我的猜測放在上面的My_Question函數中,如果我有任何錯誤,請糾正我。

是的,你的猜測會奏效。 請注意,在類調用 staticmethods 和 classmethods 也是可能的/正常的:

class A():
    ...

A.class_foo()
A.static_foo()

另請注意,常規實例方法中,習慣上直接在實例 ( self ) 而不是類 ( A ) 上調用靜態方法和類方法:

class A():
    def instance_method(self):
        self.class_foo()
        self.static_foo()

這允許繼承像您期望的那樣工作——如果我從A創建一個B子類,如果我調用B.instance_method() ,我的class_foo函數將獲得B而不是A作為cls參數——並且可能,如果我覆蓋B上的static_foo以執行與A.static_foo略有不同的A.static_foo ,這也將允許調用覆蓋的版本。

一些例子可能會更清楚地說明這一點:

class A(object):
    @staticmethod
    def static():
        print("Static, in A")

    @staticmethod
    def staticoverride():
        print("Static, in A, overrideable")

    @classmethod
    def clsmethod(cls):
        print("class, in A", cls)

    @classmethod
    def clsmethodoverrideable(cls):
        print("class, in A, overridable", cls)

    def instance_method(self):
        self.static()
        self.staticoverride()
        self.clsmethod()
        self.clsmethodoverride()

class B(A):
    @classmethod
    def clsmethodoverrideable(cls):
        print("class, in B, overridable", cls)

    @staticmethod
    def staticoverride():
        print("Static, in B, overrideable")


a = A()
b = B()
a.instance_method()
b.instance_method()

...

在你運行之后,通過改變所有的self.嘗試它self. A.instance_method里面。 重新運行並比較。 您會看到對B所有引用都已消失(即使您正在調用b.instance_method() )。 這就是為什么要使用self而不是類的原因。

正如@wim 所說,你擁有的是對的。 這是調用My_Question時的輸出。

>>> a.My_Question("My_Answer=D")
executing foo(<__main__.A object at 0x0000015790FF4668>,My_Answer=D)
executing class_foo(<class '__main__.A'>,My_Answer=D)
executing static_foo(My_Answer=D)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM