如何在嵌套 class 中调用静态方法?
How do I call a static method within a nested class?
我有两个类,一个是Parent
,一个是Child
。
在Child
中,我有两个静态函数,foo()
和bar()
。
在foo()
,我想打电话给bar()
。
但是由于Child
是嵌套的,所以我不能用常规的方式调用它。
Class Parent:
Class Child:
@staticmethod
def foo():
Child.bar() #Doesn't work
@staticmethod
def bar():
pass
在嵌套的 class 中调用静态函数时,您还必须引用父项。
Class Parent:
Class Child:
@staticmethod
def foo():
Parent.Child.bar()
@staticmethod
def bar():
pass
有两种主要方法可以实现您的目标:
像这样引用 Parent
和 Child
classes:
class Parent:
class Child:
@staticmethod
def foo():
Parent.Child.bar()
@staticmethod
def bar():
pass
使用由解释器创建的隐式 __class__
单元格 based on lexical scoping:
class Parent:
class Child:
@staticmethod
def foo():
__class__.bar()
@staticmethod
def bar():
pass
这两种方式在 Python 3.x 中都是完全可行的。
有 3 个注意事项:
过度使用静态方法有时表明存在设计缺陷,在这种情况下,外部独立函数将是更好的选择。
None 的方法将与继承一起使用。如果Parent.Child
是继承自,Parent.Child.bar()
会引用同老class的方法,而__class__
会显示同原Parent.Child
class , 因为使用了词法范围。
如果使用某些 class 装饰器,第一种方法将导致无限递归。使用 __class__
可确保您引用了真正的原始 class,并且可能有助于消除该问题。
您错误地将 Child
class 的命名空间放在 Parent
class 中,并将 Child
class 从Parent
class.
您可以像这样从 Parent
扩展 Child
class:
class Parent:
a = 1
class Child(Parent):
pass
>>> Child.a
1
与静态方法相同。
我有两个类,一个是Parent
,一个是Child
。
在Child
中,我有两个静态函数,foo()
和bar()
。
在foo()
,我想打电话给bar()
。
但是由于Child
是嵌套的,所以我不能用常规的方式调用它。
Class Parent:
Class Child:
@staticmethod
def foo():
Child.bar() #Doesn't work
@staticmethod
def bar():
pass
在嵌套的 class 中调用静态函数时,您还必须引用父项。
Class Parent:
Class Child:
@staticmethod
def foo():
Parent.Child.bar()
@staticmethod
def bar():
pass
有两种主要方法可以实现您的目标:
像这样引用
Parent
和Child
classes:class Parent: class Child: @staticmethod def foo(): Parent.Child.bar() @staticmethod def bar(): pass
使用由解释器创建的隐式
__class__
单元格 based on lexical scoping:class Parent: class Child: @staticmethod def foo(): __class__.bar() @staticmethod def bar(): pass
这两种方式在 Python 3.x 中都是完全可行的。
有 3 个注意事项:
过度使用静态方法有时表明存在设计缺陷,在这种情况下,外部独立函数将是更好的选择。
None 的方法将与继承一起使用。如果
Parent.Child
是继承自,Parent.Child.bar()
会引用同老class的方法,而__class__
会显示同原Parent.Child
class , 因为使用了词法范围。如果使用某些 class 装饰器,第一种方法将导致无限递归。使用
__class__
可确保您引用了真正的原始 class,并且可能有助于消除该问题。
您错误地将 Child
class 的命名空间放在 Parent
class 中,并将 Child
class 从Parent
class.
您可以像这样从 Parent
扩展 Child
class:
class Parent:
a = 1
class Child(Parent):
pass
>>> Child.a
1
与静态方法相同。