class test:
a="hi"
def msg(self):
print the variable for which the object is referring to
t= test()
print t.b
从上面的代码中可以看出对象是指一个不存在的变量b
答案 0 :(得分:3)
使用__getattr__
方法,请参阅documentation:
In [1]: class test(object):
...: a = 'hi'
...: def __getattr__(self, val):
...: print 'you are accessing ', val
...:
...:
In [2]: t = test()
In [3]: t.b
you are accessing b
In [4]: t.c
you are accessing c
In [5]: t.a
Out[5]: 'hi'
编辑:
class test(object):
a = 'hi'
def msg(self, var, default='undefined'):
setattr(self, var, default)
return default
def __getattr__(self, val):
print 'attribute %s not found, setting..' % val
return self.msg(val)
>>> t = test()
>>> print t.a
'hi'
>>> print t.b
'attribute b not found, setting..'
'undefined'
>>> t.b = 'this is black magic'
>>> # notice no message is printed here about attribute not found
>>> print t.b
'this is black magic'
EDIT2:
>>> d = {'a': '1'}
>>> d.setdefault('b', 'b')
'b'
>>> d
{'a': '1', 'b': 'b'}
>>> d.setdefault('a', 'b')
'1'
>>> d
{'a': '1', 'b': 'b'}
答案 1 :(得分:1)
是。您将在NameError
行上获得print b
,在print t.b
行上获得AttributeError。
你可以像这样抓住这些例外:
try:
print t.b
except AttributeError as e: # or `except AttributeError, e` on Python < 2.6
# Do something...
答案 2 :(得分:1)
这应该这样做。
class tester(object):
a = 'hi'
def __getattr__(self, val):
print 'accessing attribute %s failed!' % val
>>> t = tester()
>>> t.a
'hi'
>>> t.b
accessing attribute b failed!
>>>
编辑:删除了一些冗余代码
答案 3 :(得分:0)
如果那是所有代码,那么当然没有b
。但是,我假设您希望我们假设可能有更多代码。如果存在,或者可能是由于其他代码将此代码作为模块导入,则在运行之前无法判断。
答案 4 :(得分:0)
对象的所有成员都存储在对象__dir__
中。所以你可以这样做:
>>> "msg" in dir(t)
True
>>> "b" in dir(t)
False
这适用于标准情况,如果涉及描述符,或__getattr__
或__getattribute__
过载,则行为可能会有所不同。