python - 如何为新对象赋予不同的属性以及 __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 不允许您__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)]
由于您的代码不使用两者sex
和name
,因此您无需在__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)]