Python论坛  - 讨论区

标题:[python-chinese] 一个__getattr__的问题

2004年09月27日 星期一 11:24

limodou limodou at gmail.com
Mon Sep 27 11:24:45 HKT 2004

最近在改造NewEdit,主要是实现新的Blog处理和新增的一些xmlrpc功能的界面,遇以一个问题就是:因为NewEdit的框架是以编辑器为基础的,因此许多的菜单功能是直接调用编辑器的方法。但是现在已经增加了Html
view和blog page的编辑页,因此有些菜单功能不能直接支持,这样如果执行某些在原编辑器上可以执行的菜单功能,在新的编辑页上会报错。由于所有的编辑页都是从DocumentBase类继承来的,因此只要提供相应的空函数就可以解决问题。现在我想简化这样的处理,因此想使用__getattr__来实现。当某个方法或属性不存在时,返回一个空对象。但又出现另外一个问题,尽管我返回一个空对象,但hasattr()的返回结果总是True.代码如下:

#__getattr__的处理
	def __getattr__(self, name):
		return NULL_CLASS()

#这是空对象
class NULL_CLASS:
	def __call__(self, *argv, **kwargs):
		return None
	
	def __nonzero__(self):
		return False
	
	def __str__(self):
		return ''
	
	def __eq__(self, other):
		if not other:
			return True
		else:
			return False
		
	def __ne__(self, other):
		if other:
			return True
		else:
			return False

如果把__getattr__的处理return 改为raise AttributeError,这样,hasattr()在不存在一个属性时,会判断为假。

现在我的问题是,有没有简单的方法可以让__getattr__返回一个空类,但同时让hasattr()返回False。

当然我可以对hasattr()多加处理以解决返回不为空的问题。只是想看一看有没有更方便的用法。不然,我要修改每个hasattr()的调用--不一定很多,只是针对所有DocumentBase的派生类,可能就几个。看看有没有什么好方法。
-- 
I like python!

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号