假设我有一个类定义,它接受一些参数并使用它创建其他数据,所有这些都在__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()?
答案 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()
甚至不需要参数,它可以从封闭范围访问x
,y
和z
。
答案 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对象是不可见的