【问题标题】:PEP 8 - Module name vs variable name for instancePEP 8 - 例如模块名称与变量名称
【发布时间】:2019-07-16 07:06:03
【问题描述】:

假设我有一个 Python 模块 my_class.py (see PEP 8 convention for modules) 包含一个类 MyClass (see PEP 8 convention for classes)。

现在我想在同一个包中的一个模块中实例化该类,并且通常会这样做

from .my_class import MyClass
my_class = MyClass()

因为 PEP 8 为实例变量名称 here 提出了这种命名方案。

但是,在这种情况下,my_class 已经引用了模块 my_class.py,因此实例变量将隐藏模块。

PEP 8 或任何其他来源是否就如何在此处继续操作提供了任何指导,还是只是由开发人员为变量想一个不同但不太直观的名称?

【问题讨论】:

  • 既然实例化的class 代表一个instance(而不是“只是一个类”),那么应该写my_instance = MyClass(),不是吗?
  • @Smuuf 将其称为 MyClass 只是一个示例,在实际用例中,该类可能不会被称为 MyClass,而是 e。 G。 JsonParser.

标签: python naming pep8


【解决方案1】:

在您的示例中,您已显式导入 MyClass

当模块 my_class 被导入时,它不会在您的本地范围内分配一个变量,因此您不会通过为您的 MyClass 实例使用 my_class 来隐藏它。

更新

当在同一个包中导入一个模块时,它看起来像一个引用被添加到本地范围,但是,使用相同的名称没有风险。 Python 中的变量是对对象而不是对象的引用。

当您重新分配一个引用(例如,使用另一个对象的名称)时,如果没有其他对该对象的引用,则该对象将被删除。对于模块,它们在导入时被添加到sys.modules,在这种情况下,总是有另一个引用并且它们不会被删除。

【讨论】:

  • 谢谢!为什么如果我执行a = my_class(没有执行my_class = MyClass() 又名没有定义名为my_class 的局部变量)我仍然没有收到错误?在我的理解中,这是因为my_class 是对如果我定义了一个同名的变量会被隐藏的模块......还是我弄错了?
  • @TobiasFeil 你得到一个错误,如果你只是做from .my_class import MyClass; a = my_class
  • 另外,使用print(my_class) 来查看它的内容。例如。对我来说print(os)(导入后)是<module 'os' from '/usr/lib/python3.6/os.py'>
  • @L3viathan 抱歉,我应该说我在我的包的__init__.py 中这样做,因为我没有收到错误。
  • 仔细观察这可能与如何导入同一包中的模块有关。但是,它看起来像一个副作用,我不会依赖这种行为。除非您显式导入项目(或名称是内置的),否则您可以安全地使用名称作为变量,这样做没有风险。
猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2021-11-08
相关资源
最近更新 更多