是的,不知道你可以做出這種動態,但下面就來看看:
怪異的類型()行爲是由
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