是的,不知道你能做到多动态,但看看这里:
奇怪的 type() 行为是受
启发的
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 的硬编码。与上面的想法相同,但是您通过循环遍历 dict 并分配给翻译支持模块来驱动翻译。
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 翻译对时,您需要在将翻译 breite 分配给 Tomate 类之前检查翻译的类 (Tomato) 是否具有该属性 (width)。
关于动态属性,这是对 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))