类在python中似乎不是Global

时间:2012-03-15 21:39:38

标签: python class global local

我设置了一个类,它接受并在一个if语句中打印出变量。

class npc: #class for creating mooks
    def __init__(self, name):
        self.name = name
    def npc_iq (self,iq):
        self.iq = []
    def npc_pp (self,pp):
        self.pp = []
    def npc_melee (self, melee):
        self.melee = []
    def npc_ct (self, ct):
        self.ct = []

在if语句

中工作正常
if menu_option == 1:
    print "Choose melees for npc"
    init_bonus = random.randint(0,2)
    char_PP = random.randint(7,15)
    char_iq = random.randint(7,15)
    npc_Melees = int(raw_input(prompt))
    combat_time = math.floor((round_attacks - init_bonus - math.floor(char_PP/2) - math.floor(char_iq/2)) / npc_Melees)
    #function for calculating sequence number
    print "combat time is"
    print combat_time
    mook = "mook%s" % counter # adds different mook names to program
    mook = npc(mook) 
    mook.iq = (char_iq)
    mook.pp = (char_PP)
    mook.melee = (npc_Melees)
    mook.ct = (combat_time)
    counter += 1

但是在这个声明中,它将打印出类中的名称而不是ct。

elif menu_option ==4:
    print "Printing out all mooks"
    print
    printcount = counter -1
    while printcount != 0:
        mookprint = "mook%s" % printcount
        mookprint = npc(mookprint)
        print mookprint.name
        print mookprint.ct 
        print
        printcount -= 1

4 个答案:

答案 0 :(得分:3)

为什么mookprint会知道ct应该是什么价值? npc的构造函数初始化npc的新实例,名称作为参数给出,但ct保留为空。

在菜单选项1中创建NPC时,不会创建npc的全局实例。如果要引用先前创建的npc实例,则需要找到一些存储它们的方法。字典可能是一个很好的解决方案。字典是保存键和值之间映射的对象。如果您知道密钥,那么您可以找到所关联的值。在这种情况下,您可以将名称设为键,将值设为npc实例。

例如

npcsDict = dict()

if menu_option == 1:

   # code for intialising a new instance of npc
   ...
   # most, if not all of the initialisation code should be moved to the 
   # __init__ method for npc

   # now store the newly created mook
   npcsDict[mook.name] = mook

elif menu_option == 4:

    print "Printing out all mooks"
    print
    for mookName in npcsDict:
        print npcsDict[mookName].name
        print npcsDict[mookName].ct
        print

答案 1 :(得分:0)

如果if没有,那么只会执行elif,所以如果elif块运行,则ct从未设置

答案 2 :(得分:0)

我真的不明白你的问题。

你的工作实例:

mook = npc(mook) 
mook.iq = (char_iq)
mook.pp = (char_PP)
mook.melee = (npc_Melees)
mook.ct = (combat_time)

mook.ct是(combat_time)的值

你失败的例子:

mookprint = npc(mookprint)
print mookprint.name
print mookprint.ct 

mookprint.ct的值没什么,因为它永远不会被设置。

答案 3 :(得分:0)

我认为你不了解四条线的工作原理:

mookprint = "mook%s" % printcount
mookprint = npc(mookprint)
print mookprint.name
print mookprint.ct 

每次运行此代码块时,都会发生以下情况:

  1. 您要将"mook"形式的字符串分配给变量mookprint
  2. 您正在创建npc instance的新class。您应该注意,您创建的所有实例都将彼此分开。此新实例将具有以前在变量mookprint中保留的名称的属性,此npc实例将分配给mookprint
  3. 您正在打印在上一步中创建的name类的实例npc属性。这是有效的,因为在创建此实例时,调用类的__init__方法,并将参数name设置为“mook1”或当时存储在mookprint中的任何内容。 / LI>
  4. 您正在打印刚刚创建的ct类的实例npc属性。由于您从未将ct属性设置为任何内容,因此无法达到预期效果。
  5. 如果您想计算npc课程的实例数,则需要创建class attribute。这是一个变量,其值在所有类的实例中是通用的。为此,您需要修改类定义,以便每次创建类的新实例时将项添加到此属性。它看起来像这样:

    class npc: #class for creating mooks
        ct = []
        def __init__(self, name):
            self.name = name
            self.ct.append(name)
    
        def get_ct(self):
            return len(self.ct)
    

    通过上述内容,变量ct将是npc所有实例共有的列表,并且每次创建新npc时都会增长。然后方法get_ct将计算此列表的持续时间。

    然后你需要修改我提到的四行:

    mookprint = "mook%s" % printcount
    mookprint = npc(mookprint)
    print mookprint.name
    print mookprint.get_ct()
    

    我认为上面的代码显示了如何更改代码以更好地工作。但是,应该注意的是,您很少想要创建每个实例依赖于其他实例的信息的类。做Dunes建议的事情,将实例存储在字典或其他数据结构中,并以这种方式跟踪它们通常是更好的设计。