命名自动生成的对象,python

时间:2012-11-06 19:56:58

标签: python object naming

可以跳过斜体文字。

首先:请原谅我,如果我要求的是基本知识,也很容易找到答案,或任何类似的东西,可能会让我的帖子让任何人烦恼。我是编程新手,刚开始有一个不读考试的借口。 我正在尝试制作一个程序,它可以模仿从人类部落到人类更先进的部落的进化。我的目标是在未来的某个时间制作一个非常简单的文明游戏,专注于人而不是建筑和单位。从头开始,对目前的编程几乎一无所知,我知道这是一项我可能永远无法完成的任务。希望我会在途中学到一些东西。 因为我的知识是如此有限,我的问题将是笨拙和严重的。对不起,谢谢你的阅读。

目前的问题: 我创建了一个类,它可以创建代表人的对象。

此课程目前看起来像这样:

class Settler:
    settlerCount = 0
    iqlistfemale = []
    iqlistmale = []
    maleCount = 0
    femaleCount = 0
    surnameMale = []
    surnameFemale = []

    def __init__(self, sex):
        if sex=="m" or sex=="f" or sex=="M" or sex=="F":
            self.name = choice(surnames)
            Settler.settlerCount += 1
            self.iq=round(random.normalvariate(100,10))
            if sex=="m" or sex=="M":
                self.sex = "Male"
                Settler.iqlistmale=Settler.iqlistmale+[self.iq]
                Settler.surnameMale += [self.name]
                Settler.maleCount += 1
            else:
                self.sex = "Female"
                Settler.iqlistfemale=Settler.iqlistfemale+[self.iq]
                Settler.surnameFemale += [self.name]
                Settler.femaleCount += 1

稍后会包含更多属性,这只是一个开始。

我还制作了一个循环,要求你创建一定数量的男性,然后创建一定数量的女性。

循环事物看起来像这样:

x=int(input("Number of male Settlers to generate? (1-20) "))
if x >0 and x <21:
    tellergenerator=0  
    while tellergenerator<x:
        Settler("M")
        tellergenerator=tellergenerator+1

else:
    print("Wrong input!")



x=int(input("Number of female Settlers to generate? (1-20) "))
if x >0 and x <21:
    tellergenerator=0  
    while tellergenerator<x:
        Settler("F")
        tellergenerator=tellergenerator+1

else:
    print("Wrong input!")

另外,我做了一个def事件,允许你调用有关对象属性的信息:

def displaySettler(self):
        print("Name:", self.name, "Sex:", self.sex, "IQ:", self.iq)

现在,问题:

  1. 主要问题:我的循环工作正常,这意味着它会创建我想要创建的正确性别的对象数量。我的问题是它创建了没有名字的对象,据我所知。这意味着我不能执行displaySettler()调用,因为它需要我做nameofobject.displaySettler()。我怎样才能使用某种循环函数来创建一堆对象,使这些对象具有名称。
  2. 我找到了一种方法将一个数字组合成一个字符串,这可能允许我在循环中放入一个创建对象名称的系统,如settler1,settler2,settler3,但我这样做是为了做类似的事情。

    x=settler
    y=(some counter)
    z=x+str(y)
    

    这是我能用的东西吗?我知道使用名称创建对象的唯一方法是编写类似

    的内容
    settler1=Settler("F")
    

    w=Settler("F")
    

    是否可以使用变量z的内容来命名?

    1. 我还想问下面的内容:正如你从班上看到的那样,我正在做一堆清单。我想我必须为每个性别的每个属性制作一个列表,其中包含所有对象的特定属性。我希望这些列表能够计算每个属性的总体平均值,以及类似的东西。
    2. 是否可以直接从对象获取这些值,直接遍历所有对象并从中计算平均值?

      或者换句话说:如果我有200个对象,是否有某种方法可以将所有对象的IQ添加到一起?

      感谢阅读(如果有人这么做的话)。所有建设性的反馈将不胜感激。

4 个答案:

答案 0 :(得分:3)

您需要让您的人员生成器将生成的人员记录在数据结构中,例如列表或字典,然后从该创建的结构中访问这些人员。代替您的while循环,请尝试:

people = []
for i in range(x):
    people.append(Settler('M')) # or 'F', for the other loop

然后你可以使用:

people[n].displaySettler() # where n is any integer from 0 to x-1

答案 1 :(得分:1)

两件事:

1)最好有两个不同的类,男性和女性,它们都扩展了基类Settler。因此,您可以避免大部分if sex = M then this else that内容

示例:

class Settler:
    def __init__(self, name):
        self.name = name
        self.iq = round(random.normalvariate(100,10))

class Male(Settler):
    def __str__(self):
        return '{0.name}, male, iq {0.iq}'.format(self)

class Female(Settler):
    def __str__(self):
        return '{0.name}, female, iq {0.iq}'.format(self)

请注意两个类如何使用__str__以字符串形式“表示”自己。

2)保留与对象定义之外的对象列表有关的所有内容。好的物体不知道它们外面发生了什么。例如,这是如何生成人员列表:

def generate(klass, how_many):
    surnames = ['Doe', 'Smith', 'Mueller', 'Polly-Parrot']
    return [klass(random.choice(surnames)) for _ in range(how_many)]

people = generate(Male, 10) + generate(Female, 20)

[stuff for _ in range(N)]基本上意味着“做N次”。

最后,让我们把它们放在一起打印一份人员名单:

for person in people:
    print(person)

输出类似于:

Doe, male, iq 114.0
Doe, male, iq 110.0
Polly-Parrot, male, iq 89.0
Smith, male, iq 96.0
Polly-Parrot, male, iq 83.0
Mueller, female, iq 118.0
Mueller, female, iq 90.0
Smith, female, iq 90.0
Smith, female, iq 103.0
Mueller, female, iq 89.0
Smith, female, iq 87.0

如果您有更多问题,请告诉我们。

答案 2 :(得分:0)

回答你的第二个问题,让我们说你有一个名为people的定居者名单(这是列表理解)......

iqs = [person.iq for person in people]
total_iq = sum(iqs)

答案 3 :(得分:0)

编辑:Sr2222打败了我。我认为我们使用相同的想法。

不确定这是否是最佳方式,但是:

您可以使用循环生成的名称将对象存储在dict中。

举个例子:

group_of_vars = {}
for name in range(5):
    entry = 'object_'+str(name)
    group_of_vars[name] = entry

print group_of_vars

print group_of_vars
{0: 'object_0', 1: 'object_1', 2: 'object_2', 3: 'object_3', 4: 'object_4

因此

>>> print group_of_vars[1]
object_1

因此,通过使用这些知识,您可以创建变量名称列表(自动生成或手动)并将其保存在列表中。然后在for循环中引用列表名称作为范围,并引用该列表中的每个变量。

至于将所有IQ对象的总和加在一起,你可以这样做(按照我之前的例子,假设dict中的条目是具有iq属性值的对象)

sum = 0
for name in group_of_vars:
    sum += group_of_vars[name].iq

>>> print sum

这应该返回dict group_of_vars中所有对象的iq属性的总和。