1

Тема: Викликати метод у неяному вигляді

Привіт! Чи можливо прописати метод у неявному вигляді?

Наприклад є клас:

class Space(object):
    def __init__(self, Namespace, Vars):
        self.Namespace = Namespace
        self.Vars = Vars
    def add(self):
        print('Oh, no!')
    def get(self):
        print('HURA')
    def create(self):
        print('Strange')

Потім я створюю екземляр класу і звертаюсь до одного з його методів.

a = Space("Temp", [])
b = list(map(str, input().split()))
a.get()

Але чи можливо взяти його зі списку b, На кшалт

a.b[0]()

Дякую!

2 Востаннє редагувалося ch0r_t (25.12.2020 20:22:55)

Re: Викликати метод у неяному вигляді

Те що ви описуєте, якщо я вас правильно зрозумів звісно, можна імплементувати різним чином.
Наприклад.

def pp():
    return 42
def vv(g="nothing here"):
    print(g)

class Space(object):
    def __init__(self, Namespace, Vars):
        self.Namespace = Namespace
        self.Vars = Vars
        self.b = [pp, vv]
    def __getitem__(self, n):
        return self.b[n]
    def add(self):
        print('Oh, no!')
    def get(self):
        print('HURA')
    def create(self):
        print('Strange')

x = Space("something", [])

Почитати ще можна офіційну документацію.
https://docs.python.org/3/library/operator.html
Edit
Від посту пана koala що нижче, зрозумів чого саме ви хочете, але нащо воно вам треба так робити, ще загадка.

3

Re: Викликати метод у неяному вигляді

У об'єктів є словник елементів __dict__, але спершу треба розібратися, чий елемент метод b. А елемент це класу. Відповідно, a.get() можна записати як Space.__dict__['get'](a), а якщо ви не знаєте, до якого класу належить об'єкт, то

type(a).__dict__['get'](a)

Однак це ще не все. Об'єкти в Python можуть обробляти поля за допомогою методу __getattribute__; тобто якщо вираз a.b() коректний, то це не обов'язково означає, що в __dict__ є поле 'b', це може означати, що в перевизначеному __getattribute__ є обробка 'b'. Таким чином, коректна форма буде

type(a).__getattribute__(a, b[0])()

І, цілком можливо, я в цьому шаленому ланцюжку щось пропустив.

Подякували: leofun01, DimONN2

4

Re: Викликати метод у неяному вигляді

Так, трохи підчитав документацію. __getattribute__ викликається завжди, перевіряє __dict__ або __slots__ (про них забув), і, якщо там ніц нема, викликає __getattr__.
__getitem__ - це метод для перевантаження індексу (a['b']), а не поля (a.b).
__slots__ спеціальний масив, який обмежує можливі поля об'єктів і, відтак, скорочує об'єм об'єктів і час на звертання до полів.
Мій варіант лишається найзагальнішим.

Крім того, функція dir() дозволяє отримати список доступних полів об'єкта.

Подякували: leofun01, DimONN2

5 Востаннє редагувалося DimONN (26.12.2020 11:28:29)

Re: Викликати метод у неяному вигляді

Дякую! Сьогодні ввечері спробую імплементувати. Це учбова задача де треба змоделювати структуру простору імен з можливістю додавати простір у відповідний, а також знаходити ім'я простору де знаходиться змінна. Питання в тому, щоби не перевіряти команди користувача, а автоматично підставляти їх як метод класу.