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

问题描述 投票:0回答:1

我想知道在模块、类和方法中使用 _ 编写 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 class private pep
1个回答
3
投票

请记住,对于 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

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

© www.soinside.com 2019 - 2024. All rights reserved.