Wywołanie metody z klasy wybranej na podstawie zmiennej

Odpowiedz Nowy wątek
2019-08-02 23:42
0

Witam,

Wykonuję metodę z klasy wybranej na podstawie wartości zmiennej (symulacja w main.py)

Jest to oczywiście początkowy szablon, więc każda z klas będzie miała dodatkowo swoje własne metody czy atrybuty.
Oczywiście zanim na poważnie przejdę do dalszego pisania to wolałbym się troszkę bardziej podszkolić ale zalążek już stworzyłem.
Może ocenicie? :)

Zastanawia mnie :

  • Jak to napisać bez używania globals()?
  • Jak można to ulepszyć?
  • Czy widzicie tu coś wyjątkowo złego?

Python : 3.7.4

main.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import os

sys.path.insert(1, os.path.dirname(os.path.abspath(__file__)))
from template import Template

if __name__ == "__main__":
    print(Template("Base"))
    print(Template("One"))
    print(Template("Two"))

template.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from base import Base
from one  import One
from two  import Two

class Template(object):
    __slots__ = ('class_name',)

    def __init__(self, class_name: str) -> None:
        self.class_name = class_name

    def __str__(self) -> str:
        return globals()[self.class_name]().get_template()

base.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Base(object):
    __slots__ = ('template',)

    def __init__(self) -> None:
        self.template = "Template Base class"

    def set_template(self, template: str) -> None:
        self.template = template

    def get_template(self) -> str:
        return self.template

one.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from base import Base

class One(Base):
    __slots__ = ('template',)

    def __init__(self) -> None:
        self.template = "Template One class"

    def set_template(self, template: str) -> None:
        self.template = template

    def get_template(self) -> str:
        return self.template

two.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from base import Base

class Two(Base):
    __slots__ = ('template',)

    def __init__(self) -> None:
        self.template = "Template Two class"
        pass

    def set_template(self, template: str) -> None:
        self.template = template

    def get_template(self) -> str:
        return self.template

Linux [Debian], Arduino, Raspberry Pi, ESP8266, C++, Python.
edytowany 1x, ostatnio: Setesh, 2019-08-03 00:24
Testing... Testing... - Setesh 2019-08-04 00:22

Pozostało 580 znaków

2019-08-05 22:32
0

@Guaz: Rzeczywiście, ale jak widać wtedy, tak jak i on sam, nie wiedziałem o co chodzi:)


Pozostało 580 znaków

2019-08-05 23:07
0

Czemu w takim razie po prostu nie skorzystasz z dziedziczenia? A jak pozbyć się globals to przecież wiesz (padła już odpowiedź, że wystarczy użyć switcha (dicta)).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot