关于导入Python类的说明

关于导入Python类的说明,python,import,module,Python,Import,Module,所以我知道这可能被认为是一个相当广泛的问题,对此我很抱歉,但我在理解整个导入和\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。我试着阅读Python文档和其他一些教程,但这是我的第一语言,我有点(非常)困惑 到目前为止,我在大学的第一个学期已经学习了Python的基本知识,函数,数值类型,序列类型,基本逻辑知识。但它的发展速度比我想象的要慢,所以我自己尝试学习更多

所以我知道这可能被认为是一个相当广泛的问题,对此我很抱歉,但我在理解整个导入和
\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。我试着阅读Python文档和其他一些教程,但这是我的第一语言,我有点(非常)困惑

到目前为止,我在大学的第一个学期已经学习了Python的基本知识,函数,数值类型,序列类型,基本逻辑知识。但它的发展速度比我想象的要慢,所以我自己尝试学习更多,并以Ogame为灵感创建了一个基于文本、策略、资源管理的基本游戏

我遇到的第一个问题是如何定义每一栋建筑,例如每一个生产资源的矿山。我做了一些研究,发现课程很有用,所以我对每栋建筑都有类似的内容:

class metal_mine:

    level = 1

    base_production = 15
    cost_metal = 40
    cost_crystal = 10
    power_use = 10

    def calc_production():
        metal_mine.production = A formula goes here

    def calc_cost_metal():
        etc, same for crystal

    def calc_power_use():
        metal_mine.power_use = blah blah

    def upgrade():
        various things
        solar_plant.calc_available_power()
有点长,我遗漏了很多。总之,最后一点很重要,你看,当我升级矿井时,为了确定它是否有足够的电力运行,我计算了太阳能电站的功率输出,它属于它自己的类(
solar\u plant.calc\u output()
),它包含了许多类似于金属矿山类的东西。如果我把所有的东西都放在同一个模块中,这一切都会非常好地工作,但是有很多建筑和研究水平等等,时间会很长,我会迷失在其中

所以我试着把它分成不同的模块,一个用于矿山,一个用于仓库,一个用于研究层,等等。这使得一切都非常整洁,但是我仍然需要一种方法来调用类中的函数,这些类现在是不同模块的一部分。例如,我最初的解决方案是从power import*
引入
,这在很大程度上使
太阳能发电厂
类别在
金属矿山
类别中可用。我之所以这么说,主要是因为根据我尝试做事的顺序,有时候这似乎是行不通的。
solar\u plant
类本身调用了
metal\u mine
类中的变量,现在我知道这已经变得非常空泛了……但我还不知道还有什么更好的约定可以遵循

无论如何,有时当我调用
太阳能发电厂
类,而它又试图调用
金属矿
类时,它会说
金属矿
没有定义,这让我想到模块或类需要初始化?代码中似乎有一些东西之间的循环。根据我尝试和“玩游戏”的顺序,有时我是无意中这样做的,有时我不是。我还没有学到导入和重新加载的惯例和细节,所以我不知道我是否采取了正确的方法

如果我刚才所说的一切都是有意义的,我能得到一些关于我将如何正确地着手使这些不同模块的内容免费提供和修改给其他人的意见吗?我是不是想把事情分成不同的模块,而你通常不会这样做,我应该只处理大模块?还是我输入的东西不对?还是

另一方面,在大多数教程和我寻求帮助的地方,我看到的类或函数都是self.something和init函数。我能解释一下吗?或者链接到一个简单的第一次程序员教程

=========================更新=================

好吧,太宽了,就像我想的那样。根据我得到的帮助,我想我可以缩小范围

我整理了我认为需要的类变量,那些不变的-
名称
基本成本金属
,和
基本成本水晶
,其余的都取决于玩家当前选择的那种类型的建筑(假设他们可以有多个定居点)

让我们从我现在拥有的东西中提取一个片段:

class metal_mine:

    name = 'Metal Mine'

    base_cost_metal = 60
    base_cost_crystal = 15

    def __init__(self):
        self.level = 0
        self.production = 30
        self.cost_metal = 60
        self.cost_crystal = 15
        self.power_use = 0
        self.efficiency = 1

    def calc_production(self):
        self.production = int(30 + (self.efficiency * int(30 * self.level * 1.1 * self.level)))

    def calc_cost_metal(self):
        self.cost_metal = int(metal_mine.base_cost_metal * 1.5 ** self.level)
据我所知,这是一个定义更正确的类?我用它们的起始值定义实例变量,然后在用户播放时更改它们

在我开始游戏的主函数中,我会创建每个矿山的一个实例,比如说,
player\u metal\u mine=metal\u mine()
,然后调用所有函数和变量

>>> player_metal_mine.level
0
>>> player_metal_mine.upgrade()
>>> player_metal_mine.level
1
因此,如果这是正确定义的,我现在是否只导入每个模块以及每个建筑的这些新模板?一旦它们被导入并创建了一个实例,所有新实例及其变量是否都包含在主模块的范围内(正确的术语?),这意味着不需要新的导入或重新加载

如果答案是肯定的,我只需要导入,我应该使用什么方法?例如,我知道只有
导入地雷
,但这意味着我必须使用
地雷.player\u metal\u mine.upgrade()
来使用它,这比使用类似的
从地雷导入*
,或者更具体地说,从地雷导入metal\u mine
,要多键入一点点,尽管最后一个选项意味着我需要从每个模块分别导入每个建筑。所以就像我说的,如果是的,我只是导入它,什么方法是最好的

===========================================(您可能可以跳过文字墙,直接阅读此内容)

因此,我检查了所有内容,更正了所有类,似乎所有内容都在使用模块导入中的
正确导入*
,但我在表示资源级别的变量范围方面遇到了问题

如果所有内容都在一个模块中,我会在顶部声明每个变量并给它一个起始值,例如
metal=1000
。然后,在我的类中任何改变这一点的方法中,比如升级一栋建筑,消耗资源,或者在任何改变这一点的函数中,比如t
>>> metal_mine_one.production
30
class Test:
    def __init__(self):
        print "this is called when you create an instance of this class"
    def a_method(self):
          return True

class_instance = Test()
>>> "this is called when you create an instance of this class"
class_instance.a_method()
>>> True
class foo:
  def __init__(self, bars_starting_value):
    self.bar = bars_starting_value

  def print_bar(self):
    print(self.bar)
my_foo = foo(15)
my_other_foo = foo(100)
foo.print_bar()
foo.bar = 20
print(foo.bar)
my_other_foo.print_bar()
15
20
100