Python中的魔术方法
我对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";