Python类实例是重复的属性

DMc*_*ald 2 python class duplication instance duplicates

对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
Run Code Online (Sandbox Code Playgroud)

这是我的类定义和它正在使用的功能,我遇到了麻烦.名称和高度函数以及_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
Run Code Online (Sandbox Code Playgroud)

Vic*_*ory 5

这是一个非常常见的python问题.函数定义(在这种情况下使用命名参数)只运行一次!因此,所有默认值仅设置一次.

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

尝试做类似的事情

class NPC:
    def __init__(self, gender = None, ...):
         if gender is None:
            gender = rand_gender()
         # init the rest
Run Code Online (Sandbox Code Playgroud)

正如所建议的,这里有更多的问题

  • http://docs.python-guide.org/en/latest/writing/gotchas/是对问题的一个很好的解释,除了你的解释之外,可能值得链接. (2认同)