【问题标题】:python class and instance organizationpython类和实例组织
【发布时间】:2013-09-28 17:52:48
【问题描述】:

我有一个类定义

class DataItem(object):
    """Elementary piece of data."""

我想定义这个类的几个实例并将它们存储在某个地方。我希望我可以将 diOne 和 diTwo 定义为 DataItem 类的成员,并将它们存储在 diOne.py 和 diTwo.py 的某个地方。但是,我希望当我导入定义了 DataItem 的模块时,我可以自动访问所有定义的实例。

问题是,如何组织模块和实例文件?我这样想对吗?

编辑:充实我的意图,

我希望有更多的代码来定义每个实例。我希望它们位于单独的文件中,这样我就可以对每个实例进行更好/更轻松的版本控制,因为它们将拥有自己的生命。我可以很容易地在同一个模块中定义它们,但是当可以定义 100 多个实例时,更改模块并控制谁有权更改该代码似乎要麻烦得多。各有不同程度。挂起频率。

我希望澄清。

【问题讨论】:

  • 您希望通过这样做来实现什么?听起来您的想法并不正确,但是这个问题相当模糊。尤其是在文件中单独包含一个实例并没有多大意义。
  • 另外,通常实例没有“大量代码”。可能需要一些代码来生成适当的参数以传递给构造函数,如果这就是您的意思……但是如果您尝试将不同的方法附加到每个实例,您可能想要的是两个 子类类的实例(以及每个实例),而不是类的两个实例。
  • 更一般地说,与其向我们展示一个粗略的抽象示例,不如提出一个您希望该类及其实例做什么的具体示例(足够复杂以展示所有问题,但没有更多)。
  • @abarnert,我试图澄清我的问题,进一步意识到您的评论是正确的。但是为了清楚起见,您是在暗示我打算成为实例的应该只是子类,每个子类都有一个实例?考虑到这一点,所有这些子类是否应该存在于子目录中的单独文件中?如何将它们全部导入?
  • @piRSquared:不知道您所说的“定义每个实例的更多代码”是什么意思,我不能同意或不同意。您是指生成要传递给每个构造函数的参数的大量代码,还是指每个实例中具有独特代码的许多单独方法,还是完全不同的东西?

标签: python class instance


【解决方案1】:

我相信您可以执行以下操作。确保它们位于同一目录中。然后,您可以在 Instances.py 中创建任意数量的实例(或拥有多个具有相同结构的文件)。这能回答你的问题吗?

MyClass.py

class DataItem(object):
    def __init__(self, v):
        self.value = v

Instances.py

import MyClass

# Creates an instance of DataItem, and prints its value
diOne = MyClass.DataItem(1)
print diOne.value

【讨论】:

  • 为什么要创建一个类属性value只是为了在__init__方法中用同名的实例属性隐藏它?
  • 不要添加注释说“这是不必要的”,只需从代码中删除该行。此外,您不需要在末尾附加“编辑:”内容。答案更重要的是准确地说明它应该有帮助,而不是显示答案的历史,特别是因为 SO 允许您 see the revisions
  • 抱歉,我不确定编辑以合并其他用户的 cmets 的礼仪。我只是想确保在应得的地方给予信任。
  • 如果您真的担心信用问题,您可以随时为评论点赞。但实际上,这并不重要。让答案对 OP 和未来的读者有用比确保公平分配代表点更重要。
【解决方案2】:

没有理由拥有单独的 diOne/diTwo 文件 - 它们几乎是空的。如果你真的需要这样做,你可以在定义类的文件中这样做:

data_item.py:

class DataItem(object):
    pass

di_one = DataItem()
di_two = DataItem()

现在,当您在任何地方执行 import data_item 时,您将自动引用 data_item.di_onedata_item.di_two - 或者,您可以执行 from data_item import di_one, di_two 直接引用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 2014-07-18
    • 2012-12-30
    • 2011-03-30
    • 2011-04-20
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多