python class调用方法_在同一个Python类中调用方法,classmethod,staticmethod

是的,你的猜测会奏效。请注意,在类外部调用staticmethods和classmethods也是可能的/正常的:

class A():

...

A.class_foo()

A.static_foo()另请注意,在常规实例方法中,习惯上直接在实例(self)而不是类(A)上调用staticmethods和类方法:

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而不是类的原因。


版权声明:本文为weixin_36323859原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。