Frontend developer externista
Zobrazují se odpovědi 1 až 3 z 3

isinstance varianta akceptujúca string namiesto class

  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.
    Naposledy upravil bruce : 15.04.2011 v 11:11

  2. Co se právě děje na Webtrhu?
  3. 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

  4. Super, to je ono :) Vďaka!

    Citace Původně odeslal Paces Zobrazit příspěvek
    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

Hostujeme u Server powered by TELE3