【问题标题】:Python game programming: is my IO object a legitimate candidate for being a global variable?Python 游戏编程:我的 IO 对象是作为全局变量的合法候选者吗?
【发布时间】:2010-10-15 19:41:33
【问题描述】:

我正在用 Python 编写一个游戏,其中所有的 IO 活动都由一个 IO 对象完成(希望可以很容易地将该对象换成另一个实现不同用户界面的对象)。游戏中几乎所有其他对象都需要在某些时候访问 IO 系统(例如打印消息、更新玩家的位置、显示由游戏中动作引起的特殊效果),所以我的问题是:

对全局可用的 IO 对象的引用有意义吗?

另一种方法是将 IO 对象的引用传递到需要使用它的每个对象的 __init__() 中。我知道从测试的角度来看这很好,但这值得由此产生的“函数签名污染”吗?

谢谢。

【问题讨论】:

  • 我希望您实际上将您的 IO 对象换成一个为同一接口提供不同实现的对象。 :)
  • 是的,我应该更清楚;我用接口这个词来表示用户界面:)
  • @James:请解决您的问题。

标签: python io global-variables


【解决方案1】:

是的,这是对全局变量的合法使用。如果您不想这样做,则传递与此全局等效的上下文对象是另一种选择,正如您所提到的。

既然我假设您正在使用多个文件(模块),为什么不这样做:

import io
io.print('hello, world')
io.clear()

这是具有比简单打印更复杂的 I/O 需求的程序执行日志等操作的常用方式。

【讨论】:

  • +1:不是真正的“全局”,而是一个全局模块,这要好得多。这是一个单身人士。
【解决方案2】:

是的,我想是的。

另一种可能性是创建一个模块loggerModule,它具有print()write() 之类的功能,但这只会稍微好一点。

【讨论】:

    【解决方案3】:

    没有。

    变量过于具体,无法在全局命名空间中传递。将它们隐藏在静态函数/类中,而不是在运行时对它们做一些神奇的事情(或完全调用其他函数)。

    考虑一下如果 IO 可以周期性地改变状态或者它需要阻塞一段时间(就像许多套接字一样)会发生什么。

    考虑如果多次包含相同的代码块会发生什么。变量实例是否也会重复?

    考虑如果您想拥有相同变量的版本 2 会发生什么。如果你想改变它的界面怎么办?是否必须修改所有引用它的代码?

    感染所有使用该变量的代码并了解它可能变坏的所有方式真的有意义吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多