Python中的魔术方法

1 投票
2 回答
922 浏览
提问于 2025-04-15 23:56

我对Python还不是很熟悉,想知道有没有办法创建类似于PHP中的魔术方法的东西(http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

我的目标是让我的模型中的子类更容易访问。我基本上有一个父类,它有n个子类。这些子类有三个值:语言键、翻译键和翻译值。它们描述了一种通用的翻译处理方式。父类可以为不同的翻译键提供不同语言的翻译。例如,"title"这个键可以翻译成德语和英语,"description"这个键也是如此(依此类推)。

我不想通过设置的值来获取子类并进行过滤(我确实想这样做,但不是明确的,我希望魔术方法背后的具体实现来完成这件事)。我想调用

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

来获取德语(de)中的标题翻译。

所以必须有一个魔术方法,它可以获取被调用方法的名称和参数(就像在PHP中一样)。根据我对Python的了解,这只能通过简单的属性(__getattr__,__setattr__)或者在类内部直接设置/获取(__getitem__,__setitem__)来实现,但这两种方法都不符合我的需求。

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

2 个回答

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

返回一个对象,这个对象属于父类的标题,并且它有一个叫做 __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";

撰写回答