如何从python中的其他方法调用__private静态方法

时间:2017-11-06 09:34:05

标签: python class methods static

我假设Python类中的私有静态方法是可以而且应该完成的事情。但也许实际上我应该只是在类之外使用模块私有方法。

我想了解从不同位置调用不同类型的静态方法:

我有一个带有私有和公共静态方法的Python类。我想从其他地方和彼此打电话给他们。

当在课外并调用公共静态方法时,我必须添加类名。即

m = MyClass.the_staticmethod(100) # I must use the classname as a prefix

查看代码中的问题:

class Myclass():
    @staticmethod
    __my_privatestaticmethod(myparam):
         return myparam

    @staticmethod
    def the_staticmethod(myparam):
        # will the following work?
        result = __my_staticmethod(1) # will this work?

        # data-mingling set as private, so following line cannot work!
        result = Myclass.__my_staticmethod(2) # this cannot work. 

        result = the_staticmethod(3) # will this work without the prefix

        return result


    def __my_privatemethod(self, param1):
        # which of the following are valid?
        return __my_staticmethod(11) # will this work?

        # data-mingling set as private, so following line cannot work!
        return Myclass.__my_staticmethod(12) # this cannot work. 

        return the_staticmethod(13) # will this work without the prefix of the class? 

        return self.the_staticmethod(14) # will this work. Is the self also considered the class? 

        return  Myclass.the_staticmethod(15) # this of course works. 


    def the_method(param1):
        return __my_staticmethod(param1) # will this work?

如果1和11的答案为否,则结论是您不能制作私有静态方法。

然后我会在没有装饰器的情况下在类外部创建一个私有模块方法。这相当于私有静态类方法。

def __my_privatemodulemethod(param1):
     return param1

并且可以从我的模块中的任何地方调用它,没有前缀。

1 个答案:

答案 0 :(得分:3)

正如在评论中已经提到的deceze,在Python中staticmethod是一种方法,它不会将实例作为第一个参数。由于Python没有隐式this指针,显然staticmethod无法引用当前类,因此它无法调用当前类的另一个staticmethod。这里显而易见的解决方案是使用classmethods代替(classmethods将当前类作为第一个参数):

class Foo(object):
    @classmethod
    def _protected(cls, arg):
        print("{}._protected() called with {}".format(cls.__name__, arg))

    @classmethod
    def public(cls, arg):
        cls._protected(arg)
  

有一个私人/公众的概念与数据混合

s / data mingling / name mangling / g;)

" dunder"名称和名称修改机制不会使任何私密:

class Foo(object):
    @staticmethod
    def __not_private():
        print("peek a boo")


Foo._Foo_not_private()

As the "clunky" doc states,这里的要点主要是为了避免意外覆盖基类的某些重要实现部分。实际上这很少使用,而且大部分时间甚至都不需要。表明"实施的公约"方法和属性是使用单个前导下划线命名它们。

作为旁注,关于Python的doc质量的讽刺性评论不会让你帮助朋友。