Python:调用其';兄弟';私有方法

Python:调用其';兄弟';私有方法,python,methods,public-method,Python,Methods,Public Method,我只写了几周Python代码,所以我仍然在搞清楚事情的真相。但假设我有一个“用户”有时可以调用的方法,也可以在内部大量使用(即,在调用之前已经检查了参数)。以下是我目前正在做的事情: #The method the 'user' should call: def do_something(self, arg1, arg2, arg3): #write code to do error checking on arg1, agr2, arg3 #raise exceptions,

我只写了几周Python代码,所以我仍然在搞清楚事情的真相。但假设我有一个“用户”有时可以调用的方法,也可以在内部大量使用(即,在调用之前已经检查了参数)。以下是我目前正在做的事情:

#The method the 'user' should call:
def do_something(self, arg1, arg2, arg3):
    #write code to do error checking on arg1, agr2, arg3
    #raise exceptions, return codes, etc: depends on whether you are an explicit lover
    #or an implicit lover, it seems. :-)
    ... error checking code here...
    #Now call the 'brother' method that does the real work.
    return self._do_something(self, arg1, arg2, arg3, arg3)

#The method other private methods should call with already validated parameters
def _do_something(self, arg1, arg2, arg3, arg3):
    #don't do error checking on the parameters. get to work...
    ... do what you do...
    return whatever you're supposed to return
这在我看来是合乎逻辑的。有没有更好的Python风格的方法

Paul

python中没有对私有成员的“真正”支持,但是python将成员表示为私有的方法是使用两个前导下划线。在你的情况下,
\u做点什么


有关更多详细信息,请参见

我自己也在学习python(并很喜欢),但我认为这是实现它的方法。
但是,私有方法应该有两个下划线,并像“self.\u do\u something()”那样调用。

这很好。但是,在代码中对“brother”方法的调用是错误的。你应该这样做:

# Now call the 'brother' method that does the real work.
return self._do_something(arg1, arg2, arg3, arg3)

也就是说,您应该“通过”自引用调用它,因为它是一个对象方法,而不是一个全局函数。

好吧,除非错误检查代码非常昂贵,否则我只有一个方法,总是执行错误检查。它可能会重复一些检查,但它确实为您提供了更多的安全性,如果有人从您的类继承,它可能会派上用场


如果以后需要性能,您可以始终缓存结果或执行其他操作。

可以通过向对象本身的init中添加函数来创建真正的私有字段,该函数使用闭包引用局部变量。虽然似乎没有多少人知道这一点。-1:在实践中很少使用两个下划线,通常的python方法是使用一个下划线。@nikow,你在这里完全错了。在Python中,两个下划线是实现“private”的方式,它甚至有语言支持(名称从
\uuuufoo
\uclassname\uufoo
)。您可能会想到Python对“受保护”成员的约定(仅此而已),它只使用一个下划线。有一种基于四字符代码从FTP下载文件的方法。用户可以单独调用一个要下载的文件,也可以根据索引文件中编写的代码要求下载一批57000多个文件。如果用户调用它,我需要检查他们传入的代码。如果代码来自包含57000代码的索引文件,则无需检查以确保其格式有效!在这种情况下,我想把这两种方法分开是有意义的。不过,我会使用不同的名称,以明确一个方法用于用户输入,另一个方法不用于建议的编辑方法调用。