2015-03-26 2 views
0

, поэтому я пытаюсь создать программу, но у меня все еще возникают трудности с классами. Программа (которая не закончена, конечно) напечатает случайное число Деревн. Каждая деревня (второй класс) будет иметь случайное число кланов (первый класс). Во всяком случае, моя проблема - это класс деревни. Как я могу добавить области и размер семьи в класс Village? Как вставить счетчик из класса клана в класс Village? Как вы можете видеть, когда я рандомизировал несколько Кланов, области и размеры семьи должны были бы сгруппировать в класс Village. Что мне делать? Что не так с моим деревенским классом?Классы, объекты и списки в python

class Clan: 
counter = 0 

def __init__(self): 
    r = random.randrange(20, 101) 
    self.area = r 
    s = random.randrange(1, 6) 
    self.familySize = s 
    Clan.counter += 1 
    self.counter = Clan.counter 

def getArea(self): 
    return self.area 

def getFamilySize(self): 
    return self.familySize 


class Village: 
counter = 0 

def __init__(self): 
    self.clan_list = [] 
    for i in range(random.randrange(3, 7)): 
     self.clan_list += [Clan()] 
def getclan_list(self): 
    return self.clan_list 
def getArea(self): 
    return self.area 
def getPopulation(self): 
    pass 
+0

Здравствуйте, я не знаю, что вы пытаетесь сделать здесь Clan.counter + = 1 self.counter = Clan.counter Clan.counter всегда будет 0, если вы хотите изменить экземпляр, должны использовать себя. – lapinkoira

+0

Что значит вставить счетчик кланов в деревню? Я не следую твоей мысли. Остальное, что я получаю, просто не клановый счетчик, вставленный в деревню. – Dunes

+0

@lapinkoira: 'Clan.counter' - атрибут класса; это не всегда будет 0. Испытайте класс «Клана» для себя и посмотрите, что произойдет. –

ответ

0

Итак, вы хотите, чтобы класс деревни подсчитал, сколько семей находится в деревне?

families = 0 
for clan in self.clan_list 
    families += clan.getFamilySize() 
1

Поскольку значения площади и численности населения зависит от кланов clan_list вы должны вычислить эти значения от каждый раз, когда они необходимы. Альтернатива намного сложнее - нужно контролировать, как кланы добавляются и удаляются из деревни и о том, как изменить размер и размер клана в клане и изменить его в деревне.

Ниже приведен пример того, как вы можете вычислить как село, так и население. Первый использует метод геттера, а второй использует другое свойство python-esque.

import random 

class Clan: 
    counter = 0 

    def __init__(self): 
     r = random.randrange(20, 101) 
     self.area = r 
     s = random.randrange(1, 6) 
     self.familySize = s 
     Clan.counter += 1 
     self.counter = Clan.counter 

    # removed getters 
    # Unless your getter or setter is doing something special, 
    # just access the attribute directly. 



class Village: 

    def __init__(self): 
     self.clan_list = [] 
     for i in range(random.randrange(3, 7)): 
      self.clan_list.append(Clan()) 

    # for a village, area is a computed value, so use a getter 
    def getArea(self): 
     total_area = 0 
     for clan in self.clan_list: 
      total_area += clan.area 
     return total_area 

    # the prefered alternative to getters (and setters) are properties 
    # note that the function is named as if it was an attribute rather than function 
    @property 
    def population(self): 
     # use sum and generator rather than a for loop 
     return sum(clan.familySize for clan in self.clan_list) 


# How to use a village instance 
v = Village() 
# get area 
print("area:", v.getArea()) 
# get population 
print("population:", v.population) 
# note how population is accessed as if it was an attribute rather than called 
# like a function