我无法在类外部得到一个定义的var来添加在类内部定义的var

2024-06-08 15:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我贴了这一段时间前,但我已经清理了一点,从那以后,问题仍然存在,因为没有人真正给出一个正确的答案。 所以我的问题是,我在类外定义的变量和循环stonepilewoodpile(在类内)没有多次向自身添加stone/wood(也在同一类内),我知道这一点是因为我得到了要打印的stonepile/woodpile。我已经测试过,问题实际上是开始时的stonepile/woodpile每次被告知将stone/wood添加到stonepile/woodpile时都被重置。我知道这是因为我和他们一起做的:

y = random.randint(1,5)
x = random.randint(1,5)
woodpile = y
stonepile = x

结果是,如果开采的石头是1,x的randint是5,它将打印6。或者类似的东西。 有什么办法可以解决吗?你知道吗

整个代码如下:

import random
import time
idle = True
woodpile = 0
stonepile = 0

while True:
    class Taskassigner:
        def __init__(self,tasknum,stonepile,woodpile):
            self.tasknum = tasknum
            self.woodpile = woodpile
            self.stonepile = stonepile
        def choosejob(self,stonepile,woodpile):
            if self.tasknum == 1:
                self.chop(woodpile)
            if self.tasknum == 2:
                self.mine(stonepile)
        def chop(self,woodpile):
            wood = random.randint(1, 10)
            print('chopping wood')
            time.sleep(1.5)
            print('you got', wood)
            woodpile += wood
            print(woodpile)
            time.sleep(0.75)
        def mine(self,stonepile):
            stone = random.randint(1, 10)
            print('mining for stone')
            time.sleep(1.5)
            print('you got', stone)
            stonepile += stone
            print(stonepile)
            time.sleep(0.75)

    while idle:
        taskchance = random.randint(0,1)
        if taskchance == 1:
            tasknum = random.randint(0,2)
            job = Taskassigner(tasknum,stonepile,woodpile)
            job.choosejob(stonepile,woodpile)
            print
        else:
            print('idle')
            time.sleep(0.5)

Tags: importselfiftimedefsleeprandomprint
3条回答

您可以找出在while idle循环之外实例化变量的方法。我会尽量不将tasknum作为__init__输入变量之一

class Taskassigner:
        def __init__(self,stonepile,woodpile):
            self.tasknum = 0
            self.woodpile = woodpile
            self.stonepile = stonepile

另外,由于你不能砍石头或我的木头,你不必把他们包括在你的所有方法。 i、 e

def chop(self):
            wood = random.randint(1, 10)
            print('chopping wood')
            time.sleep(1.5)
            print('you got', wood)
            self.woodpile += wood
            print(self.woodpile)
            time.sleep(0.75)

def choosejob(self):
            if self.tasknum == 1:
                self.chop()
            if self.tasknum == 2:
                self.mine()

然后你可以打电话:

job = Taskassigner(tasknum,stonepile,woodpile)

while idle:
        taskchance = random.randint(0,1)
        if taskchance == 1:
            job.tasknum = random.randint(0,2)
            job.choosejob()
            print
        else:
            print('idle')
            time.sleep
            (0.5)

我的工作代码是这样的:

import random
import time
idle = True
woodpile=0
stonepile=0


class Taskassigner:
    def __init__(self,tasknum):

        self.tasknum = tasknum
        self.choosejob(tasknum)
    def choosejob(self,tasknum):

        if self.tasknum == 1:
            self.chop()
        if self.tasknum == 2:
            self.mine()
    def chop(self):

        global woodpile
        wood = random.randint(1, 10)
        print('chopping wood')
        time.sleep(1.5)
        print('you got', wood)
        woodpile += wood
        print(woodpile)
        time.sleep(0.75)
    def mine(self):

        global stonepile
        stone = random.randint(1, 10)
        print('mining for stone')
        time.sleep(1.5)
        print('you got', stone)
        stonepile += stone
        print(stonepile)
        time.sleep(0.75)


while idle:

    taskchance = random.randint(0,1)
    if taskchance == 1:
        tasknum = random.randint(0,2)
        Taskassigner(tasknum)
    else:
        print('idle')
        time.sleep(0.5)

如果要修改函数(或类函数)中的全局函数,则需要使用全局函数

foo = 0
def afunc():
    global foo
    foo = 1

afunc()
print foo

全局变量的名称与类内部的名称相同。我注意到有些地方你做了woodpile += wood而你可能想要self.woodpile += wood

相关问题 更多 >