![](/img/trans.png)
[英]python child class method calling overridden classmethod with non-classmethod
[英]Calling method, classmethod, staticmethod in the same Python class
從一個著名的例子中,我了解了 Python 類中方法、類方法和靜態方法之間的區別。
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.