为什么字典会在没有我告诉它的情况下自动打印?

时间:2013-12-18 01:02:23

标签: python class dictionary

我正忙着学习如何更好地使用它们的课程和词典。我提出的想法是创建一堆类,为一些对象提供了一堆不同的描述符,我使用了来自D& amp;的怪物。 D,然后创建一个包含所有这些怪物的字典,这样我就可以使用字典中的键从类中加载描述符。

import dice #a dice module i made
import textwrap

class Goblin(object):
    def __init__(self):
        self.name = 'Goblin'
        self.desc = 'bla bla bla, I'm not going to type the whole thing.'
        self.health = dice.d8.roll(1) + 1

    def describe(self):
        print self.name
        print self.health, 'other random info not in self.desc'
        print textwrap.fill(self.desc, 60)

goblin = Goblin() 所以这是我的课程设置。当我输入print goblin.describe()时一切正常。然后我设置了我的字典:

bestiary = {
    'Goblin': goblin.describe()
    }

我删除了goblin.describe(),所以没有命令告诉程序打印任何东西,但是当我运行程序时,它运行goblin.describe()并显示描述我的妖精的文本块。我的问题是为什么它会这样做,有没有办法让它不这样做,所以我可以独立使用goblin.describe()或any_other_monster_I make.describe()并让它拉出描述?

我知道可能有更简单的方法可以做到这一点,但我只是想弄明白为什么这样做。

4 个答案:

答案 0 :(得分:3)

嗯,你实际上正在评估这里的描述(称之为)

bestiary = {
    'Goblin': goblin.describe()
}

您可以尝试返回字符串而不是仅仅打印它:

import dice #a dice module i made
import textwrap

class Goblin(object):
    def __init__(self):
        self.name = 'Goblin'
        self.desc = 'bla bla bla, I''m not going to type the whole thing.'
        self.health = dice.d8.roll(1) + 1

def describe(self):
    return self.name + " " + self.health + " " + 'other random info not in self.desc ' \
           + 'other random info not in self.desc ' + textwrap.fill(self.desc, 60)


goblin = Goblin()

bestiary = {
    'Goblin': goblin.describe()
}

答案 1 :(得分:0)

基于“当我投入印刷gob​​lin.describe()时,一切正常。”我想你想要这样的东西:

def describe(self):
    result = ""
    result += self.name
    result += str(self.health) + ' other random info not in self.desc'
    result += textwrap.fill(self.desc, 60)
    return result

即。从describe()返回描述,不要在方法内打印。

答案 2 :(得分:0)

  

我知道可能有更简单的方法来做到这一点,但我只是想弄清楚它为什么会这样做。

采取这样的方式:

def bla():
   print("bla")

def alb():
   return("alb")

bbb = bla()
aaa = alb() #this could be anthing not just "aaa= alb()" it could be something like thing_dict = {'thing': alb() }

bla功能将打印“bla”。打印是一种简单的说法:“它是标准输出,很可能是你的控制台”这个打印在bla返回之前发生,所以它只是打印然后返回none(因为你并没有告诉它返回任何东西)(除非另有说明,否则所有功能都没有退货)

bla()可以重写为

def bla():
    print("bla")
    return None

它会做同样的事情。

alb函数返回“alb”,因为您明确告诉它。

如果您执行type(bbb),则会NoneType因为bla()没有返回任何内容

如果您执行type(aaa),您将获得str,因为alb()函数返回了“alb”

如果您执行print(bbb),您将获得None,因为这是bla()返回的内容(您未定义退货,因此返回None

如果你print(aaa),你会得到“alb”,因为你告诉alb()要返回

答案 3 :(得分:0)

我不确定我是否完全按照你要做的。我真的不明白你的意思是“删除了goblin.describe()”。你是说你是从dict中删除它,还是从课堂上删除了这个方法?在任何一种情况下,也许一些缓存?删除工作目录中的任何.pyc文件,然后重试。

或者您可能正在尝试将该方法添加到字典中,以便稍后可以调用describe?你可以添加方法,而不是调用它(记住,在python中,所有东西,包括方法,都是对象)。因此,您可以完美地做到:

goblin = Goblin()
bestiary = { 'Goblin' : goblin.describe }
# and later call 'describe' as follows
bestiary['Goblin']()

# though personally I'd opt for the following which is more legible
goblin = Goblin()
bestiary = { 'Goblin' : goblin }
bestiary['Goblin'].describe()