如何在嵌套类中调用静态方法?

时间:2019-01-27 23:15:49

标签: python-3.x class nested static-methods

我有两个班级,一个是Parent,另一个是Child

Child中,我有两个静态函数foo()bar()。 我想在foo()中打电话给bar()

但是由于Child是嵌套的,所以我不能使用常规方式来调用它。

Class Parent:

    Class Child:

        @staticmethod
        def foo():
            Child.bar() #Doesn't work

        @staticmethod
        def bar():
             pass

3 个答案:

答案 0 :(得分:1)

有2种主要方法可以实现您想要的目标:

  1. 同时引用ParentChild类:

    class Parent:
    
        class Child:
    
            @staticmethod
            def foo():
                Parent.Child.bar()
    
            @staticmethod
            def bar():
                 pass
    
  2. 使用由解释器based on lexical scoping创建的隐式__class__单元格:

    class Parent:
    
        class Child:
    
            @staticmethod
            def foo():
                __class__.bar()
    
            @staticmethod
            def bar():
                pass
    

这两种方式在Python 3.x中都是完全可行的。

有3个警告:

  1. 过度使用静态方法有时表明存在设计缺陷,在这种情况下,外部独立功能将是更好的选择。

  2. 所有方法都不能与继承一起使用。如果从Parent.Child继承,则Parent.Child.bar()将引用同一旧类的方法,而__class__将显示相同的原始Parent.Child类,这是使用词法作用域的。 / p>

  3. 如果使用某些类装饰器,则第一种方法将导致无限递归。使用__class__可以确保您引用的是真正的原始类,并且可以帮助消除该问题。

答案 1 :(得分:1)

通过将java.sql.SQLException: Unknown initial character set index '192' received from server. 类扩展到Child类中,将Parent类的命名空间放在Child类中是错误的。

您可以像这样从Parent扩展Child类:

Parent

与静态方法相同。

答案 2 :(得分:0)

在嵌套类中调用静态函数时,还必须引用父级。

Class Parent:

    Class Child:

        @staticmethod
        def foo():
             Parent.Child.bar()

        @staticmethod
        def bar():
            pass