如何定义我只想在__init__方法中使用的Python方法,即无法从类定义外部访问?

时间:2015-09-15 19:07:38

标签: python class

假设我有一个类定义,它接受一些参数并使用它创建其他数据,所有这些都在__init__方法中:

class Foo():

    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
        self.bar = generate_bar(x, y, z)

    def generate_bar(self, x, y, z):
        return x+y+z

我只想在创建类的实例时运行generate_bar()方法一次,因此该方法在实例上可调用是没有意义的。是否有更简洁的方法来确保方法仅适用于__init__,或者我只需要假设任何查看我的代码的人都会理解,从来没有适合的情况在类的实例上调用generate_bar()?

2 个答案:

答案 0 :(得分:5)

如果您没有使用任何实例状态,只需将其设为单独的函数:

def _generate_bar(x, y, z):
    return x + y + z

class Foo():
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
        self.bar = _generate_bar(x, y, z)

按照惯例,前导下划线表示它是一个内部功能,不会被模块的外部消费者使用。

可以将函数嵌套在__init__中,但这对可读性没有任何帮助:

class Foo():
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

        def generate_bar():
            return x + y + z

        self.bar = generate_bar()

此处generate_bar()甚至不需要参数,它可以从封闭范围访问xyz

答案 1 :(得分:1)

对于“隐藏”功能,习惯上使用单个下划线表示您的意图:

def _generate_bar(self, x, y, z): ...

这些仍然可以访问,但通过标签页完成无法看到。

请参阅此SO explanation

class foo:
    def __init__(self):
        self.response = self._bar()
    def _bar(self):
        return "bar"

f = foo()
>>> f.response
bar

您可以通过标签页完成

验证自己的功能_bar对象是不可见的