【问题标题】:How to move code of an inner class to different file (Python)?如何将内部类的代码移动到不同的文件(Python)?
【发布时间】:2015-02-15 16:12:29
【问题描述】:

假设我有一些带有内部类的类:

class A:
   class B:
      ...
   ...

我想在与 A 类的代码不同的文件中实现类 B 以提高可读性。

如何做到这一点?


编辑:我不希望B 可以通过A.B 以外的任何方式访问。

【问题讨论】:

  • 选择、剪切、新建文件、粘贴、保存?
  • @poke - 但这不会使 B 成为一个完全不同的类吗?我希望它可以通过 A.B. 访问
  • 你可以在外面定义classA 仍然可以创建 B 的新实例,因此 a.b 或您为实例命名的任何名称都可以访问它们。
  • @TidB - 我不确定我是否理解。能详细点吗?
  • @RB 我基本上说了@sweeneyrod 在他的回答中写的内容。

标签: python class module


【解决方案1】:

你可以这样做:

b_class.py:

class _B:
    ...

a_class.py:

import b_class

class A:
    B = b_class._B
    ...

Pythonic OOP 的原则之一是“我们都是同意的成年人”。这意味着您通常不想强行隐藏信息。前导下划线曾经表示“不要使用它”,但它们不会阻止访问内容。

虽然通常你不需要像这样嵌套类。你想这样做是为了什么?可能有更好的解决方案。

【讨论】:

  • 但这会使 B 无法通过 A.B 访问(使用 _B),这是我不想要的。
  • @RB 你有 Java 还是 C++ 背景?保护概念(private、protected、public)不会转化为 Python。作为 sweeneyrod,指出如果您告诉我们为什么您需要嵌套范围,可能会有更好的解决方案。
  • @msw - 我的A 类是一个隐马尔可夫模型,B 是模型中的一个状态。我是唯一一个使用代码的人,所以它比其他任何东西都更利于我的可读性。当然我可以创建一个外部类HMM_Node 或类似的东西,但是当它是一个内部类时更清楚。我认为认为嵌套类是一个糟糕的解决方案是不对的,即使它只是帮助我维护代码。
  • 感谢您的解释。似乎您确实有相互矛盾的愿望:“我想在与 A 类的代码不同的文件中实现 B 类”与“但当它是一个内部类时,我更清楚。”。显然,两者都不能满足。
  • @msw - 我没有看到这里的矛盾。内部类是指我想通过HMM.State 访问它,其中HMM 是外部类,State 是内部类。这是通过使用这种结构的更复杂算法的代码来访问的。我希望能够像这样使用它并随时查看/编辑不同文件中的类,为什么会出现问题?
【解决方案2】:

您似乎正在研究 C++ namespace 或 Java package 声明原则,这不是 Python 模型。 Python 中命名空间的实现是基于文件名的。对象(类、函数等)由包含它们的源文件命名。

您想要 HMM 和 HMM.State?好吧,按照 sweeneyrod 的建议做,并使用 has-a 对象组合原则:

import states

class HMM {
    def __init__(self):
        self.markov_stuff = stuff
        self.state = states.State(more_stuff)
        …
}

这就是它的工作原理,其中states.py 包含class State 的定义。

如果你想让它看起来更“集成”,你可以使用from states import Stateyielding

from states import State

class HMM {
    def __init__(self):
        self.markov_stuff = stuff
        self.state = State(more_stuff)
        …
}

这为您提供了单独的文件:markov.py 和 states.py,其语法减少了一级 . 间接。

如果你想要别的东西,要么你会陷入混乱(和非常规)的模块字典修改中,这是不推荐的。不同的语言允许以不同的方式表达意图,这就是pythonic的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多