【问题标题】:How can i make a method available only from within the class我怎样才能使一个方法只在类内可用
【发布时间】:2022-01-24 16:25:13
【问题描述】:

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

  • 智能感知不可见/不可用的方法
  • 如果我很固执,无论如何都要编写代码,一定会报错。

附上屏幕截图以使其更清晰。 感谢您的任何建议,谢谢。

Screenshot of the problem

【问题讨论】:

  • Python 不允许您对开发人员绝对隐藏函数。但最接近它的是“dunder”方法。它将对智能感知隐藏起来,然后让开发人员更难看到它。
  • afaik dunder 方法指的是双前导 尾随下划线,例如 __init__。 “私有”方法仅用前导双下划线标记。

标签: python class methods


【解决方案1】:

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

【讨论】:

  • OK 解决了,你让我走上了正确的道路,我通过双下划线隐藏到 pycharm 的智能感知方法(VS Code 仍然可以看到它,但是嗯......)这样方法仍然存在可调用为 myobj._myclass__hismethod() 但我可以禁止它通过 accessify 模块执行,因为有人建议我。
【解决方案2】:

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

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.。因此,如果不是,则认为它是从类外部调用的,并引发 Exception(可能会向其添加一些消息)。

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

self = MyClass()
self.some_method()

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

【讨论】:

  • 这是一场骇人听闻的暴行,我喜欢 +1
【解决方案3】:

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

from accessify import private

class myclass:
    @private
    def __somemethod(self)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2019-05-21
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多