gpt4 book ai didi

python - 在同一个Python类中调用方法、类方法、静态方法

转载 作者:太空宇宙 更新时间:2023-11-04 00:27:04 32 4
gpt4 key购买 nike

从一个著名的例子中,我了解了 Python 类中方法、类方法和静态方法之间的区别。

Source: What is the difference between @staticmethod and @classmethod in 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 函数中,如果我有任何错误,请纠正我。

最佳答案

是的,您的猜测会奏效。请注意,在类的外部调用静态方法和类方法也是可能的/正常的:

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 略有不同的事情,这也将允许调用被覆盖的版本。

一些例子可能会更清楚这一点:

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()

...

运行之后,通过将 instance_method 中的所有 self. 更改为 A. 来尝试。重新运行并比较。您会看到对 B 的所有引用都已消失(即使您正在调用 b.instance_method())。这就是为什么您想使用 self 而不是类。

关于python - 在同一个Python类中调用方法、类方法、静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47088492/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com