回答
覆盖__getattr__
应该没问题 - __getattr__
仅作为最后手段被调用,即如果实例中没有与该名称匹配的属性。例如,如果您访问foo.bar
,则仅在foo
没有称为bar
的属性时才会调用__getattr__
。如果属性是一个你不想来处理,提高AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
然而,不同于__getattr__
,__getattribute__
称为第一(仅适用于新的样式类,即那些从对象继承)。在这种情况下,您可以保留默认行为,如下所示:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
return object.__getattribute__(self, name)
Bah,您的编辑与我在回答中显示的内容相同+1。 – 2010-03-08 23:51:34
很酷,Python似乎不喜欢在'__getattr__'中调用super - 任何想法该怎么办? ('AttributeError:'super'对象没有属性'__getattr __'') – gatoatigrado 2013-06-11 23:33:59
没有看到你的代码很难说,但看起来你的超类没有定义__getattr__。 – 2015-04-11 16:00:47
class A(object):
def __init__(self):
self.a = 42
def __getattr__(self, attr):
if attr in ["b", "c"]:
return 42
raise AttributeError("%r object has no attribute %r" %
(self.__class__, attr))
# exception text copied from Python2.6
>>> a = A()
>>> a.a
42
>>> a.b
42
>>> a.missing
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: 'A' object has no attribute 'missing'
>>> hasattr(a, "b")
True
>>> hasattr(a, "missing")
False
谢谢你。只是想确保我有正确的默认消息,而不需要在源代码中进行挖掘。 – ShawnFumo 2013-11-04 17:48:47
我认为应该使用'self .__ class __.__ name__'来代替'self .__ class__',以防类重写'__repr__' – 2016-01-11 20:46:33
为了延长迈克尔回答,如果你想保持使用__getattr__
默认行为,你可以像这样:
class Foo(object):
def __getattr__(self, name):
if name == 'something':
return 42
# Default behaviour
return self.__getattribute__(name)
现在异常消息是更具描述:
>>> foo.something
42
>>> foo.error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getattr__
AttributeError: 'Foo' object has no attribute 'error'
@ fed.pavlo您确定吗?也许你把'__getattr__'和'__getattribute__'混合了? – 2016-09-16 07:41:32
我的不好。我错过了来自不同方法的来电。 ( – 2016-09-19 10:18:06
- 1. 如何在不覆盖默认选项的情况下传递选项散列?
- 2. 如何在不覆盖默认行为的情况下展开OSMbonuspacket标记的setOnMarkerClickListener?
- 3. 如何在不违反AutoLayout约束的情况下隐藏UITableViewCells
- 4. 默认情况下在VBox
- 5. 在默认情况下
- 6. FactoryGirl在默认情况下
- 7. 默认情况下python-excel不匹配
- 8. 覆盖typeheadhead默认行为
- 9. CakePHP - 如何在这种情况下不违反MVC或DRY
- 10. 默认情况下,为什么不在Windows上安装Python?
- 11. 在不使用默认情况下解析python中的日期
- 12. 如何在默认情况下运行cuda中的pytorch运算
- 13. 如何覆盖select的默认行为:在jQuery UI Autocomplete中?
- 14. 如何在不改变行为的情况下覆盖虚拟方法?
- 15. 默认情况下如何在python 3下运行.py可执行文件?
- 16. 在Python中覆盖默认选项卡行为Tkinter
- 17. 默认情况下不会执行C++
- 18. 产量和默认情况||不输出默认情况下
- 19. 覆盖JTextPane中TAB的默认行为
- 20. 如何在不覆盖它的情况下传输$ exercise参数?
- 21. 如何在不覆盖的情况下写入hdf5文件?
- 22. 如何在不覆盖java的情况下写入文件?
- 23. 如何在不关闭文件的情况下覆盖文件
- 24. 如何在不覆盖内容的情况下粘贴页脚?
- 25. 为什么Map在默认情况下在Scala中不可变?
- 26. 为什么Multicore JIT不在默认情况下在.net 4.5中?
- 27. 如何覆盖浏览器文件的默认下载行为?
- 28. 如何在不使用的情况下覆盖GWT中的默认样式重要的
- 29. 在不覆盖数据的情况下插入行
- 30. 要在不覆盖数据的情况下进行git结账
“休息”,它问,而不是“改变”。这足够清楚:“奇特”属性不应该干扰内置属性,并应尽可能像他们那样表现。迈克尔的回答既正确又有帮助。 – olooney 2010-03-09 00:04:03