Python类实例是重复的属性

时间:2015-08-03 23:47:09

标签: python class duplicates instance duplication

对OOP来说相对较新,只是试图为游戏制作NPC类,除非另有说明,否则应根据随机值生成不同的NPC实例。只是概念证明。

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

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

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

这是我的课程定义及其使用的功能,我遇到了麻烦。名称和高度函数以及_str__方法似乎没问题,所以我还没有把它们包括在内。正如您所看到的,性别,年龄和种族都是重复的。为什么会这样?你能用函数来初始化类对象吗?

输出:

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

1 个答案:

答案 0 :(得分:5)

这是一个非常常见的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