<p>您需要重写<code>__getattr__</code>:</p>
<pre><code>class Foo(object):
attr_a = 'default_attr_a_value'
attr_b = 'default_attr_b_value'
def __init__(self, *args, **kwargs):
if len(args) >= 2:
self.attr_a = args[0]
self.attr_b = args[1]
if len(args) == 1:
self.attr_a = args[0]
# holds the "emulated" attributes
self._properties = kwargs
def __getattr__(self, name):
if name in self._properties:
return self._properties[name]
else:
raise AttributeError
def __hasattr__(self, name):
return name in self._properties
bar = Foo('modified_value_of_attr_a', **{'aaa':1,'bbb':2})
print bar.attr_a
print bar.attr_b
print bar.aaa
try:
print bar.sss
except AttributeError:
print 'Attribute error raised!'
list_attrs = ['attr_a', 'aaa', 'sss']
for a in list_attrs:
if hasattr(bar, a):
print 'bar, instance of Foo, has an attribute named "%s"' % a
else:
print 'bar, instance of Foo, doesn\'t have an attribute named "%s"' % a
</code></pre>
<p><a href="https://stackoverflow.com/questions/2405590/how-do-i-override-getattr-in-python-without-breaking-the-default-behavior">More to read</a></p>