Python class 个实例是重复属性

Python class instances are duplicating attributes

对 OOP 来说相对较新,只是在尝试为游戏制作 NPC class,该游戏应根据随机值生成不同的 NPC 实例,除非另有说明。真的只是概念验证。

然而,年龄、性别和种族属性由于某种原因而重复,即使它们是由应该 return 随机值的函数生成的。

我已经单独测试了这些功能,它们正在做它们应该做的事情,并不复杂。

class NPC:
    def __init__(self, gender = rand_gender(), race = rand_race(),
                 age = rand(16, 70),name = "", height = 0):
        self.gender = gender
        self.race = race
        self.age = age
        if name == "":
           self.name = name_gen(self.gender)
        else: self.name = name
        if height == 0:
            self.height = height_gen(self.race)
        else: self.height = height

def rand(min, max):
    return random.randrange(min, max)

def rand_gender():
    genders = ["Male", "Female"]
    random.shuffle(genders)
    return genders[0]

def rand_race():
    races = ["Human", "Dwarf", "Elf", "Orc"]
    random.shuffle(races)
    return races[0]

npc1 = NPC()
npc2 = NPC()
npc3 = NPC()
hero = NPC("Female","Human", 26, "Hero")

print npc1
print npc2
print npc3
print hero
print npc1 == npc2

这是我的 class 定义以及我在使用时遇到问题的函数。名称和高度函数以及 the__str__ 方法似乎没问题,所以我没有包括它们。如您所见,性别、年龄和种族是重复的。为什么会这样?可以使用函数初始化 class 个对象吗?

输出:

Name: Jane Gender: Female Age:32 Race: Elf Height: 6.4
Name: Wilma Gender: Female Age:32 Race: Elf Height: 6.7
Name: Jane Gender: Female Age:32 Race: Elf Height: 6.5
Name: Hero Gender: Female Age:26 Race: Human Height: 5.7
False

这是 python 的一个极其常见的问题。函数定义(在本例中带有命名参数)只有 运行 一次!所以所有默认值只设置一次。

class NPC:
    def __init__(self, gender = rand_gender(), race = rand_race(),
                 age = rand(16, 70),name = "", height = 0): # run only once

尝试做类似

的事情
class NPC:
    def __init__(self, gender = None, ...):
         if gender is None:
            gender = rand_gender()
         # init the rest

按照提示,这里是even more gotchas