gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:27:29 25 4
gpt4 key购买 nike

我假设 Python 类中的私有(private)静态方法是可以而且应该做的事情。但也许实际上,我应该只是在类外使用模块私有(private)方法。
我想了解从不同位置调用不同类型的静态方法:
我有一个带有私有(private)和公共(public)静态方法的 Python 类。我想从其他地方给他们打电话,从对方那里打电话。
在类外调用公共(public)静态方法时,我必须添加类名。 IE。

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 的答案是否定的,那么结论是您不能创建私有(private)静态方法。
然后我会在没有装饰器的类之外创建一个私有(private)模块方法。这相当于私有(private)静态类方法。
    def __my_privatemodulemethod(param1):
return param1
并且可以从我模块中的任何位置调用它,无需前缀。

最佳答案

正如 deceze 在评论中已经提到的那样,在 Python 中,staticmethod是一种不将实例或类作为第一个参数的方法。由于 Python 没有隐式 this指针,显然是 staticmethod无法引用当前类,因此无法调用另一个 staticmethod在当前类(class)。这里明显的解决方案是使用 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)

there IS a notion of private/public achieved with data mingling



s/数据混合/名称修改/g ;)

“dunder”名称和名称修饰机制不会使任何内容成为私有(private):
class Foo(object):
@staticmethod
def __not_private():
print("peek a boo")


Foo._Foo_not_private()

As the "clunky" doc states ,这里的重点主要是避免意外覆盖基类的某些重要实现部分。实际上,这很少使用,而且大多数时候甚至不需要。指示“实现”方法和属性的约定是用单个前导下划线命名它们。

附带说明一下,关于 Python 文档质量的刻薄评论不会让您对 friend 有太多帮助。

关于python - 如何从python中的其他方法调用__private静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47133734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com