我假设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
并且可以从我的模块中的任何地方调用它,没有前缀。
答案 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质量的讽刺性评论不会让你帮助朋友。