将变量传递回python中的类

时间:2018-04-12 15:45:25

标签: python class global python-nonlocal

我是新人,请耐心等待我。以下是我的代码:

class Player():
    name = "UnknownName"
    stren = 10
    dex = 10
    con = 10
    intel = 10
    wis = 10
    cha = 10

    def randAssign(self):
        global stren, dex, con, intel, wis, cha
        stat_List = [stren, dex, con, intel, wis, cha]

        for stat in stat_List:
             r_1 = random.randint(1,6)
             r_2 = random.randint(1,6)
             r_3 = random.randint(1,6)
             r_4 = random.randint(1,6)

             stat_Val = r_1 + r_2 + r_3 + r_4 - min(r_1, r_2, r_3, r_4)
             stat = stat_Val

randAssign是Player()中的一个方法 我正在尝试随机设置玩家的统计数据,并且需要在激活randAssign()时重写类变量。 出于这样或那样的原因,使用global会传递以下错误:

NameError: name 'stren' is not defined. 

使用Nonlocal会产生此错误:

SyntaxError: no binding for nonlocal 'stren' found

没有全局或非本地,它只是不重写Player()'s变量。 我已经完成了十几次这样的迭代,从完全错误到“我认为这会起作用但它没有”,需要帮助。

3 个答案:

答案 0 :(得分:3)

如此定义类中的变量将使您的类的所有实例共享这些变量,这可能导致时髦的情况(特别是对于可变对象)。 (请参阅Python documentation)您最有可能想要做的是:

class Player:

    def __init__(self):
        self.stren = 10
        self.xcx = 10
        etc.

    def randAssign(self):
        self.stren = randint(1,10)
        ...

答案 1 :(得分:2)

不确定您是否熟悉类和实例方法,但请尝试以下方法:

class Player():
    name = "UnknownName"
    stren = 10
    dex = 10
    con = 10
    intel = 10
    wis = 10
    cha = 10

    @classmethod
    def randAssign(cls):
        stat_List = [cls.stren, 
                     cls.dex, 
                     cls.con, 
                     cls.intel, 
                     cls.wis, 
                     cls.cha]

        for stat in stat_List:
             r_1 = random.randint(1,6)
             r_2 = random.randint(1,6)
             r_3 = random.randint(1,6)
             r_4 = random.randint(1,6)

             stat_Val = r_1 + r_2 + r_3 + r_4 - min(r_1, r_2, r_3, r_4)
             stat = stat_Val

考虑到你正在做的事情(创建随机玩家统计数据),如果在实例化时__init__调用下按照每个玩家实例完成,这将更加合适。

阅读此SO以获取有关这两种方法之间差异的更多信息。

修改:在评论中说明一点......

这是您在使用方法时遇到的问题(上面的示例仅解决了您的范围问题,而不是您的实施问题)

class Temp:
    stat = 1
    @classmethod
    def test(cls):
        stats = [cls.stat] # container contains copies of primitive types 
        print (stats) # [1]
        for i in range(1):
            stats[i] = (stats[i] + 2) * 3 # 1 + 2 * 3 = 9
        print (stats) # [9]
        print (cls.stat) # 1

要执行您想要的评论:

class Temp:
    stats = {'stat': 1}
    @classmethod
    def test(cls):
        stats = [cls.stats] # container contains reference to another container
        print (stats) # {'stat': 1}
        for stat in stats:
            cls.stats[stat] = (cls.stats[stat] + 2) * 3 # 1 + 2 * 3 = 9
        print (stats) # {'stat': 9}
        print (cls.stats) # {'stat': 9}, look they updated!

答案 2 :(得分:1)

由于您已在函数定义中传递了self参数,因此应在相应的命名空间中引用这些变量:

self.stren = ...

而不是

globals stren
stren = ...