python中的对象属性

时间:2011-03-09 06:03:48

标签: python

   class test:
      a="hi"

      def msg(self):
          print the variable for which the object is referring to

   t= test()
    print t.b

从上面的代码中可以看出对象是指一个不存在的变量b

5 个答案:

答案 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__过载,则行为可能会有所不同。