logo
15.04.2011 10:48
1
Zdravím,

mám triedu Building, z ktorej následne dedia jednotlivé typy budov. V Building potrebujem implementovat mechanizmus, ktorý podľa definície v danej triede prevedie kontrolu, či sú splnené nároky na stavbu budovy. Čiže chcem previesť niečo takéto:

Kód:
class Building(object):
    # (class, level)
    REQUIREMENTS = (
        ('BaseBuilding', 1),
        ('OilPlatformBuilding', 3),
        ...
    )

    def can_be_built(self):
        for requirement in self.REQUIREMENTS:
            ...

class BaseBuilding(Building):
    REQUIREMENTS = (...)

class OilPlatformBuilding(Building):
    REQUIREMENTS = (...)
Nemôžem v REQUIREMENTS uviesť priamo triedy a v can_be_build použiť isinstance, pretože triedy sú definované až ďalej v kóde, môžem, teda použiť len stringy na ich identifikáciu. Prístup k inštanciám jednotlivých typov budov je zabezpečený, len neviem, ako môžem otestovať na základe stringu, či to je daná inštancia. Vie niekto poradiť?

Update: Rýchlejšie píšem, než rozmýšľam :) V self.buildings mám zoznam budov, kde každá budova je inštancia daného typu budovy, takže potrebujem niečo na tento spôsob:

Kód:
def can_be_built(self):
    for requirement in self.REQUIREMENTS:
        for building in self.buildings:
            if isinstance(building, requirement[0]):
                if building.level > requirement[1]: return True
    return False
Toto samozrejme nefunguje, pretože requirement[0] je string a nie class.

Co se právě děje na Webtrhu?

15.04.2011 12:29
2
Nevypadá to dobře, ale je to funkční. :-D
Kód:
def can_be_built(self):
    for requirement in self.REQUIREMENTS:
        for building in self.buildings:
            if building.__class__.__name__ == requirement[0]:
                if building.level > requirement[1]: return True
    return False
15.04.2011 12:36
3
Super, to je ono :) Vďaka!

Původně odeslal Paces
Nevypadá to dobře, ale je to funkční. :-D
Kód:
def can_be_built(self):
    for requirement in self.REQUIREMENTS:
        for building in self.buildings:
            if building.__class__.__name__ == requirement[0]:
                if building.level > requirement[1]: return True
    return False