Python中的Python用法或下划线(私有)名称



我想知道在模块,类和方法中使用_来编写python代码的哪种方式更python。

示例1:

import threading as _threading
class Thread(_threading.Thread):
pass

from threading import Thread
class MyThread(Thread):
pass

在模块级别,像这样在方法中引入私有变量有意义吗?

def my_module_method():
_throw = foo + bar
return _throw

def my_module_method():
throw = foo + bar
return throw

私有名称的最佳用法是防止类的实例使用某些私有临时方法,例如:

class MyClass(object):
_my_internal = 0
def _do_not_use_me()
pass

使该类的最终用户知道不要直接在:

中使用这些方法
foo = MyClass._do_not_use_me()
bar = MyClass._my_internal

对于私有名称的一般用法,如有其他建议,我将不胜感激。

请记住,在Python中没有什么是"硬性规则"。更多的约定。除了一些例外,在变量前加上你想要的前缀并没有什么错,只要你保持一致并且你的代码容易理解。

然而,如果你想遵循一般的惯例,请继续阅读。

一般

由于Python不像其他语言那样具有访问修饰符(访问修饰符如private,public,protected等),_前缀标记了类中不能外部访问的字段,方法等。它标志着私人使用。

记住这一点,让我们一个接一个地看你的例子:

示例1

首选的方式是:

from threading import Thread
class MyThread(Thread):
pass

你也可以使用:

import threading
class MyThread(threading.Thread):
pass

但是你不应该在导入模块前加上_前缀。

示例2

一般情况下,不能访问函数的内部变量。因此,没有理由使用_。因此是这样的:

def my_module_method():
throw = foo + bar
return throw

我能想到的唯一例外是在嵌套函数的情况下,您可以复制名称,并使用_来区分变量:

def my_outer_method():
throw = foo + bar
def my_inner_method(_throw):
return _throw * 2

return my_inner_method(throw)

示例3

是的,这就是为什么你要使用_前缀的确切原因。

my_class = MyClass()
foo = my_class._do_not_use_me()
bar = my_class._my_internal

告诉类的使用者,他们正在做一些不应该做的事情,或者做一些不安全的事情。

最新更新