是的,不知道你可以做出这种动态,但下面就来看看:
怪异的类型()行为是由
http://www.jeffknupp.com/blog/2013/12/28/improve-your-python-metaclasses-and-dynamic-classes-with-type/
class Tomato(object):
def __init__(self,color):
self.color = color
T = Tomato('red')
T.color
di_trad = {"Tomato": "Tomate"}
def xlator(self, attrname):
di = {"farbe":"color"}
attr_eng = di.get(attrname,attrname)
return getattr(self, attr_eng)
这个工程......但仅仅是因为TOMATE是硬编码......你不会想要做的启发这个,但它是向你展示基本的想法。
Tomate = type("Tomate",(Tomato,),dict(__getattr__=xlator))
t = Tomate('rot')
print t.farbe
#to me this is the weak point ... emitting arbitrary dynamic classnames
#into the current module. mind you, we really want to do this against
#say an import german module...
# and we want to allow drive which classes we translate dynamically as well
下面是同样的动态世代,但没有关于Tomato或Tomate的编码。通过循环字典并分配给翻译支持模块,您可以推动翻译。
di_class_trad = {"Tomato" :"Tomate"}
import german
for engname, tradname in di_class_trad.items():
cls_ = globals().get(engname)
setattr(german, tradname, type(tradname,(cls_,),dict(__getattr__=xlator)))
#in any case
t2 = german.Tomate("blau")
print t2.farbe
,输出:
腐 布劳
顺便说一句,在german.py的内容,上面只是:
pass
而且,翻译程序是由字典驱动的,所以理论上它非常有活力。
我会将所有属性保留在一个字典中,而不是每个类字典。然后,当你通过farbe/color,height /höhe,width/breite翻译对时,你需要检查翻译类(番茄)是否具有该属性(宽度),然后将它的翻译分配给类Tomate。
关于动态属性,这是对Sublime Text作为属性框架生成的调整。如果您对xlator词典循环开着它和分配的财产,以目标类,谁知道,它可能工作...
def farbe():
doc = "The farbe property."
def fget(self):
return self.color
def fset(self, value):
self.color = value
def fdel(self):
del self.color
return locals()
#farbe = property(**farbe())
#would this work?
setattr(tgt_class,"farbe", property(**farbe()))
可爱的,但同样,不知道有多少真正的使用,这将是,除非您将实际的用户可见翻译功能保留为非常基本的操作。这可能有助于将Tomate分配给类型调用中的第二个祖先类,以添加一些大脑以保持理智。
即
setattr(german, tradname, type(tradname,(cls_,SanityManagerClass),dict(__getattr__=xlator))
“是否有一个能够支持这个任何语言?”是的,Perl:https://metacpan.org/pod/Lingua::tlhInganHol::Ighun – davidism 2014-12-04 05:56:24
对于那些投票结束 - 嗯,为什么?这不是一个合法的编程问题?如果这是一个重复,我很乐意遵守这一点。 – kcrisman 2014-12-04 15:32:56