派生类和__getattr__

我面临以下问题:
班级基础(对象):
def __getAttr __(self,attr):返回lambda x:attr +'_' + x
def dec(可召唤):
返回lambda *args:'dec_' + callable( *args)
派生的类(基础):
what_so_ever = dec(base.what_so_ever)#错误,基础没有
任何
mumu = dec(base.mumu)#错误,基础
没有mumu
知道该怎么做吗?

# 回答1


AlexandruMoèoi写道:
__getAttr __()在类中定义以创建实例属性
飞.如果您想要类属性,则必须放置__getAttr __()方法
进入班级或" metaclass"的班级:
班级基础(对象):
__类Metaclass __(类型):
def __getAttr __(self,attr):
返回lambda self,x:attr +'_' + x
def dec(可召唤):
返回lambda *args:'dec_' + callable( *args)
派生的类(基础):
what_so_ever = dec(base.what_so_ever)
d = derived()
打印D.What_so_ever(" 42")
我看不出如何将其变成有用的东西...
彼得
# 回答2


Oi的Alexandru Mos写道:
是否曾经想过使用Python编写Python程序?
# 回答3


在9月5日,11:47*AM,Peter Otten <__ Pete ...@web.dewrote:
__getAttr __()在类中定义以创建实例属性
飞.如果您想要类属性,则必须放置__getAttr __()方法
进入班级或" metaclass"的班级:
班级基础(对象):
***类__ metaclass __(类型):
**â**â* def __getAttr __(self,attr):
***â**â*返回lambda self,x:attr +'_' + x
def dec(可召唤):
***返回lambda* args:'dec_' + callable(* args)
派生的类(基础):
** what_so_ever = dec(base.what_so_ever)
d = derived()
打印D.What_so_ever(" 42")
我看不出如何将其变成有用的东西...
彼得
10倍.有用.但是我还有另一个小问题.现在,
D.三(" blah")不起作用,因为实例D没有"第三"
属性.我期望派生的班级将元素继承为
好吧,但事实并非如此.
# 回答4


Alexandru Mosoi写道:__getAttr __()在类中定义以在Fly上创建实例属性.如果要类属性,则必须将__getAttr __()方法放入类或" metaclass"的类中:class base(object):class __metaclass __(type):def __getAttr __(self,attr):返回lambda self,return lambda self, x:attr +'_' + xdef dec(可呼叫):返回lambda *args:'dec_' + callable( *args)类derived(base):what_so_ever = dec(base.what_so_ever)d = derived()d = derived()print d. what_so_ever(" 42")我看不到如何将其变成有用的东西...彼得

10倍.有用.但是我还有另一个小问题.现在,
D.三(" blah")不起作用,因为实例D没有"第三"
属性.我期望派生的班级将元素继承为
好吧,但事实并非如此.
这与继承无关:

如果Python在实例中找不到属性,它将在
上课,但不在元中:
<功能
Trackback(最近的最新电话):
文件" ",第1行,<模块>
attributeError:" base"对象没有属性'第三'
我认为您现在应该回到绘图板,寻找更简单的
解决您的实际问题的方法...
彼得

# 回答5


在9月5日,11:46*AM,Alexandru Mosoi 是的,在这里解释:https://www.ibm.com/developererworks/l...ary/l-pymeta2/
如果您告诉我们您要解决的真正问题,那将有所帮助.
# 回答6


在9月5日,1:13*PM,Peter Otten <__ Pete ...@web.dewrote:
这与继承无关:

如果Python在实例中找不到属性,它将在
上课,但不在元中:
<函数>> base().
Trackback(最近的最新电话):
*文件" ",第1行,
attributeError:" base"对象没有属性'第三'
我认为您现在应该回到绘图板,寻找更简单的
解决您的实际问题的方法...
彼得

我以某种方式解决了问题:
def __getAttr __(self,attr):
返回
functools.partial(base .__ metaclass __.__ getAttr __(s elf .__ class__,
att),自我)
但是,这看起来很丑陋,可以寻找另一种解决方案.我仍然
还有一个问题:为什么我必须束缚自我? (没有哪个
函数失败期望实例)

# 回答7


Alexandru Mosoi Aâ©Crit:
(剪)
因为部分类型未实现描述符协议
(通过函数类型实现以返回方法).

标签: python

添加新评论