【问题标题】:Python custom module import from module with only one public methodPython自定义模块从只有一种公共方法的模块导入
【发布时间】:2014-08-04 11:33:08
【问题描述】:

关于静态方法和私有方法的问题......

假设我有这样的事情:

    class MyClass(object):

        @staticmethod
        def __methodA(a):
            return a

        @staticmethod
        def __methodB(b):
            return b

        @staticmethod
        def __methodC(c):
            return c

        @staticmethod
        def getAddition(a, b, c):
            a = MyClass.__methodA(a)
            b = MyClass.__methodB(b)
            c = MyClass.__methodC(c)
            return a + b + c

我真的只想公开一个方法,而且我有一大堆辅助方法。对我来说,没有@staticmethod 似乎很愚蠢,因为我必须这样做:

from myModule import MyClass
myClass = MyClass()
myClass.getAddition(1,2,3)

但是使用@staticmethod 我可以做到这一点(这对我来说更有意义,因为我只调用一件事):

from myModule import MyClass
MyClass.getAddition(1,2,3)

我知道以前有人问过这类问题。但具体来说,我想知道如果我有 50 个辅助方法并且仍然只有一个公共方法,那么用 @staticmethod 做这样的事情是否是不好的做法。

这个类可能会被很多人使用,我不知道为一种方法显式创建该对象是否有意义。

【问题讨论】:

    标签: python static-methods python-decorators


    【解决方案1】:

    我认为你的方法很好。或者,您可以使用模块而不是带有静态方法的类,因为当您不打算创建它的实例时,无需创建类。

    在 Python 中私有方法不是限制,而是推荐,因此不需要限制对此类方法的访问。用下划线开头的方法来表示这个方法就足够了。

    这里是模块而不是类的示例:

    // mymodule.py
    
    def _methodA(a):
        return a
    
    def _methodB(b):
        return b
    
    def _methodC(c):
        return c
    
    def getAddition(a, b, c):
        a = _methodA(a)
        b = _methodB(b)
        c = _methodC(c)
        return a + b + c
    
    // user code
    
    import mymodule
    
    mymodule.getAddition(1, 2, 3)
    

    【讨论】:

    • 如果我这样做,其他人将能够导入诸如_methodC之类的东西,这不是我想要的。我只希望用户能够使用一种方法。
    • 请看我回答的第二段:你绝对不能也不应该限制对方法的访问。这不是 Pythonic 的做事方式。在您的方法中,我可以称您为“私有”方法,例如MyClass._MyClass__methodA(1)
    • @user2599709:用户还可以访问类的“私有”静态方法。根据设计,程序任何部分的代码都可以从程序中的任何其他位置访问几乎任何内容。
    • 哦,相信我,我知道我们不应该这样做。它更像是一个......如果单独使用辅助方法非常强大和危险,但主要方法使它变得安全。我知道没有“私人”,但名称修改使其“安全”。
    • @user2599709:呃……不,不是吗?访问损坏的名称并不困难。您最终会得到一个未记录的方法,其名称告诉您不要使用它,就像使用常规下划线名称一样。
    猜你喜欢
    • 2021-02-20
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多