Магические методы в Python

Я новичок в Python, и мне интересно, есть ли способ создать что-то вроде магических методов в PHP (http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods)

Моя цель - облегчить доступ к дочерним классам в моей модели. У меня в основном есть родительский класс, который имеет n дочерних классов. Эти классы имеют три значения: ключ языка, ключ перевода и значение перевода. Они описывают своего рода общую обработку перевода. Родительский класс может иметь переводы для разных ключей перевода на разных языках. Например. ключ «название» можно перевести на немецкий и английский языки, а также ключ «описание» (и так далее, и так далее)

Я не хочу получать дочерние классы и фильтровать по заданным значениям (по крайней мере, я хочу, но не явно, конкретная реализация магического метода сделает это). я хочу позвонить

parent_class.title['de']
# or also possible maybe
parent_class.title('de')

для получения перевода названия на немецком языке (de).

Так что должен быть волшебный метод, который принимает имя вызываемого метода и его параметры (как в PHP). Насколько я копался в Python, это возможно только с простыми атрибутами (__getattr__, __setattr__) или с установкой/получением непосредственно внутри класса (__getitem__, __setitem__), которые оба не соответствуют моим потребностям.

Может быть, есть решение для этого? Пожалуйста помоги! Заранее спасибо!


person dArignac    schedule 14.06.2010    source источник


Ответы (2)


Возвращает объект для parent_class.title, который имеет метод __getitem__.

class parent_class:
    def __init__(self):
        self.title = multilang("hello world");

class multilang:
    def __init__(self, text):
        pass
    def __getitem__(self, key):
        if key == 'en':
            return "hello world";
person Sjoerd    schedule 14.06.2010
comment
Ну, это решение, о котором я не думал, но оно очень хорошо подходит для моих нужд, так как я должен учитывать некоторые другие факты об окружающей среде, которые я не упомянул ;) Спасибо за это! - person dArignac; 14.06.2010

Вы могли бы изменить код на parent_class['de'].title. Тогда что-то вроде этого, вероятно, сработает

from collections import defaultdict

class X(object):
    def __init__(self, title = "", description = ""):
        self.title = title
        self.description = description

parent_class = defaultdict(X)

parent_class['en'] = X("title", "description")
parent_class['de'].title = "Titel"
person Michael Kuhn    schedule 14.06.2010
comment
Хорошее решение, но, к сожалению, не работает в моей среде из-за некоторых ограничений, с которыми я связан. Но все равно спасибо! - person dArignac; 14.06.2010