我想知道在模块,类和方法中使用_来编写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
但是你不应该在导入模块前加上_
前缀。
一般情况下,不能访问函数的内部变量。因此,没有理由使用_
。因此是这样的:
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
告诉类的使用者,他们正在做一些不应该做的事情,或者做一些不安全的事情。