我怎样才能使方法仅在 class 中可用

How can i make a method available only from within the class

晚上好,我需要一个建议,谷歌搜索我找不到合适的方向。 我需要使方法仅在 class 内可用(即其他方法或函数),如果从程序中调用作为引用 class 我想要的对象的方法:

附上截图,更清楚。 感谢任何建议,谢谢。

Screenshot of the problem

python 中没有私有方法。常见用法规定在只应在内部使用的方法之前加上一个或两个下划线,具体取决于情况。看这里:What is the meaning of single and double underscore before an object name?

正如其他人所提到的,Python 中没有私有方法。我也不知道如何让它对智能感知不可见(可能有一些设置),但理论上你可以做的是:

import re


def make_private(func):
    def inner(*args, **kwargs):
        name = func.__name__
        pattern = re.compile(fr'(.*)\.{name}')
        with open(__file__) as file:
            for line in file:
                lst = pattern.findall(line)
                if (lst and not line.strip().startswith('#')
                   and not all(g.strip() == 'self' for g in lst)):
                    raise Exception()
        return func(*args, **kwargs)
    return inner


class MyClass:

    @make_private
    def some_method(self):
        pass

    def some_other_method(self):
        self.some_method()


m = MyClass()
# m.some_method()
m.some_other_method()

它 (make_private) 是一个装饰器,基本上当您调用它正在装饰的函数时,它首先逐行读取整个文件并尝试查找是否在所有文件中都调用了此方法没有前缀 self.。因此,如果不是,则认为它是从 class 外部调用的,并且会引发 Exception(可能会向其添加一些消息)。

一旦你有多个文件,问题就可能开始了,这不会完全阻止有人调用它,如果他们真的想要,例如,如果他们这样做的话:

self = MyClass()
self.some_method()

但大多数情况下这会引发异常。

OK 解决了,为了 hide ide 的 Intellisense 方法我添加了双下划线(适用于 pycharm,不适用于 vscode)然后我使用 accessify 模块来防止强制执行调用 myobj._myclass__somemethod()

from accessify import private

class myclass:
    @private
    def __somemethod(self)