我想知道在模块、类和方法中使用 _ 编写 Python 代码哪种更 Pythonic 方式。
示例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
等),因此 _
前缀标记了类中不需要的字段、方法等。外部访问。它标志着私人使用。
考虑到这一点,让我们一一看看您的示例:
首选方式是:
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)
是的,这就是您使用
_
前缀的确切原因。
my_class = MyClass()
foo = my_class._do_not_use_me()
bar = my_class._my_internal
这告诉该课程的使用者他们正在做一些不应该做的事情或一些不安全的事情。