首页 > 解决方案 > 如何为新对象赋予不同的属性以及 __init__ 究竟是如何工作的?

问题描述

所有对象都有不同的随机名称变量,但它们都具有相同的随机性别。这怎么可能发生?如何使所有对象具有不同的随机性别变量?我使用__init__正确吗?我必须添加到我的类方法中吗?

我正在制作一个包含人口(对象列表)的游戏(来自村民类的对象)。我希望他们获得随机性别,Class 根据性别从名称列表中为每个对象提供随机名称。

但是出了点问题,性从一开始就保持不变。不过名字不一样!

你能帮忙解决这个问题并提出更多相关的文献吗?

import random

mnames = ['Ivan', 'Oleg', 'Kirill']

fnames = ['Katya', 'Masha', 'Olga']

population = [1,1,1,1,1]

class villager:
    age = 0
    sex = random.randint(0,1)
    name = ''


    def __init__(self, sex = 10):
            self.sex = random.randint(0,1)


    def __init__(self, name = ''):
        if self.sex == 0:
            self.name =  mnames[random.randint(0, len(mnames)-1)]
        if self.sex == 1:
            self.name =  fnames[random.randint(0, len(fnames)-1)]

populsize = len(population)

for i in range(populsize):
    population[i] = villager()

for i in range(len(population)):
    print(population[i].sex, population[i].name )

我希望看到这样的事情:

1 Katya
0 Ivan
0 Ivan
0 Kirill
1 Olga

实际结果是(总是同性,第一个数字):

0 Kirill
0 Ivan
0 Oleg
0 Oleg
0 Oleg

或者

1 Olga
1 Katya
1 Masha
1 Olga
1 Katya

标签: python

解决方案


Python 不允许您__init__像在 C++ 中那样重载。类中的第二个定义__init__覆盖第一个定义。

sex在您的代码中,永远不会更改的类级别变量。不需要这些类级别的定义。

class villager:
    #these aren't needed, better to set in __init__()
    #age = 0
    #sex = random.randint(0,1)
    #name = ''

    #this definition is overwritten by the next definition of __init__()
    def __init__(self, sex = 10):
            self.sex = random.randint(0,1)

定义类的正确方法是:

class villager:

    def __init__(self, sex=10, name=''):
        self.sex = random.randint(0,1)
        if self.sex == 0:
            self.name =  mnames[random.randint(0, len(mnames)-1)]
        if self.sex == 1:
            self.name =  fnames[random.randint(0, len(fnames)-1)]

由于您的代码不使用两者sexname,因此您无需在__init__方法中指定它们。如果您确实希望在实例化 a 时选择设置它们villager,但也希望它们是可选的,您可以这样编码:

class villager:

    def __init__(self, sex=None, name=None):
        if sex is not None:   # must be specific because you define sex as 0,1
            self.sex = sex
        else:
            self.sex = random.randint(0,1)
        if name:
            self.name = name
        else:
            if self.sex == 0:
                self.name =  mnames[random.randint(0, len(mnames)-1)]
            if self.sex == 1:
                self.name =  fnames[random.randint(0, len(fnames)-1)]

推荐阅读