我设置了一个类,它接受并在一个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
答案 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
每次运行此代码块时,都会发生以下情况:
"mook"
形式的字符串分配给变量mookprint
npc
instance的新class。您应该注意,您创建的所有实例都将彼此分开。此新实例将具有以前在变量mookprint
中保留的名称的属性,此npc
实例将分配给mookprint
。name
类的实例的npc
属性。这是有效的,因为在创建此实例时,调用类的__init__
方法,并将参数name
设置为“mook1”或当时存储在mookprint
中的任何内容。 / LI>
ct
类的实例的npc
属性。由于您从未将ct
属性设置为任何内容,因此无法达到预期效果。如果您想计算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建议的事情,将实例存储在字典或其他数据结构中,并以这种方式跟踪它们通常是更好的设计。