Python中的魔术方法

时间:2010-06-14 11:40:15

标签: python magic-methods

我对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__)中设置/获取,这两者都不符合我的需要。

也许这有解决方案?请帮忙! 提前谢谢!

2 个答案:

答案 0 :(得分:4)

返回具有__getitem__方法的parent_class.title的对象。

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";

答案 1 :(得分:1)

您可以将代码重构为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"