dir()和vars()区别

>>> class a:
... foo=100
  File "<stdin>", line 2
    foo=100
      ^
IndentationError: expected an indented block
>>> class a:
...     foo=100
...     def funcr(a,b)
  File "<stdin>", line 3
    def funcr(a,b)
                 ^
SyntaxError: invalid syntax
>>> class a:
...     foo=100
...     def fufnc(a,b):
...             return  a+b
... 
>>> dir(a)
['__doc__', '__module__', 'foo', 'fufnc']
>>> vars(a)
{'fufnc': <function fufnc at 0x7f36c560faa0>, '__module__': '__main__', 'foo': 100, '__doc__': None}
>>> type(a)
<type 'classobj'>
>>> b=a()
>>> dir(b)
['__doc__', '__module__', 'foo', 'fufnc']
>>> vars(b)
{}
>>> class c(object):
...     fooo=200
... 
>>> dir(a)
['__doc__', '__module__', 'foo', 'fufnc']
>>> dir(c)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'fooo']
>>> vars(c)
<dictproxy object at 0x7f36c5626830>
>>> c.__dict__
<dictproxy object at 0x7f36c5626328>
>>> d=c()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'fooo']
>>> vars(d)
{}
>>> d.__dict__
{}
>>> a.__dict__
{'fufnc': <function fufnc at 0x7f36c560faa0>, '__module__': '__main__', 'foo': 100, '__doc__': None}
>>> b.__dict__
{}
>>> 

---


>>> vars()
{'a': <class __main__.a at 0x7f36c56186b0>, 'c': <class '__main__.c'>, 'b': <__main__.a instance at 0x7f36c5627a28>, 'd': <__main__.c object at 0x7f36c56253d0>, 'di': {}, '__builtins__': <module '__builtin__' (built-in)>, 'value': {'a': 'WWWWWWWWWWW'}, 'li': [], 'i': '1', 'key': 'diii', '__name__': '__main__', '__package__': None, 'os': <module 'os' from '/usr/lib64/python2.6/os.pyc'>, '__doc__': None, 'diii': {'a': 'WWWWWWWWWWW'}}


>>> vars().items()
[('a', <class __main__.a at 0x7f36c56186b0>), ('c', <class '__main__.c'>), ('b', <__main__.a instance at 0x7f36c5627a28>), ('d', <__main__.c object at 0x7f36c56253d0>), ('di', {}), ('__builtins__', <module '__builtin__' (built-in)>), ('value', {'a': 'WWWWWWWWWWW'}), ('li', []), ('i', '1'), ('key', 'diii'), ('__name__', '__main__'), ('__package__', None), ('os', <module 'os' from '/usr/lib64/python2.6/os.pyc'>), ('__doc__', None), ('diii', {'a': 'WWWWWWWWWWW'})]


>>> print "\n".join(["%s=%s" %(key,value) for key,value in vars().items()])
a=__main__.a
c=<class '__main__.c'>
b=<__main__.a instance at 0x7f36c5627a28>
d=<__main__.c object at 0x7f36c56253d0>
di={}
__builtins__=<module '__builtin__' (built-in)>
value={'a': 'WWWWWWWWWWW'}
li=[]
_[1]=['a=__main__.a', "c=<class '__main__.c'>", 'b=<__main__.a instance at 0x7f36c5627a28>', 'd=<__main__.c object at 0x7f36c56253d0>', 'di={}', "__builtins__=<module '__builtin__' (built-in)>", "value={'a': 'WWWWWWWWWWW'}", 'li=[]']
i=1
key=diii
__name__=__main__
__package__=None
os=<module 'os' from '/usr/lib64/python2.6/os.pyc'>
__doc__=None
diii={'a': 'WWWWWWWWWWW'}
>>> 

### 回答1: 这个错误提示意味着在调用Pythonvars()函数时,传入的参数不是一个带有__dict__属性的对象。vars()函数用于返回一个对象的属性和属性值的字典。 通常情况下,vars()函数可以接受任何具有__dict__属性的对象作为参数,例如Python内置的对象类型(如字典、列表、字符串等),或者自定义的类实例。但如果传入的参数不具有__dict__属性,那么就会出现上述的错误提示。 ### 回答2: “vars()”函数是Python内置的一个函数,用于返回一个对象的字典形式,包括对象的属性和值。当我们使用vars()函数时,参数必须是一个拥有__dict__属性的对象。 在Python中,每个对象都有一个字典形式的属性__dict__,存储了该对象的所有属性和对应的值。当我们调用vars()函数时,它会返回这个字典。 如果我们传递给vars()函数的参数不具备__dict__属性,就会出现错误信息“vars() argument must have __dict__ attribute”。 为什么要求参数具备__dict__属性呢?这是因为vars()函数的实现机制决定的。我们知道,vars()函数返回的是对象的属性和值,而这些属性和值都存储在对象的__dict__属性中。因此,只有具备__dict__属性的对象,才能正常的返回属性和值的字典形式。 举个例子,如果我们定义一个空的类,该类没有定义属性也没有实例化对象,那么这个类就没有__dict__属性,因为它没有任何属性需要存储。因此,如果我们尝试对这个类调用vars()函数,就会出现“vars() argument must have __dict__ attribute”的错误。 总结来说,vars()函数要求参数具有__dict__属性是因为它的实现机制需要读取对象的属性和值,并将其以字典形式返回。如果参数没有__dict__属性,就无法正常进行存储和读取操作,因此会报错。 ### 回答3: 当我们调用`vars()`函数时,我们必须给它传递一个具有`__dict__`属性的参数。`__dict__`属性是一个字典,它保存了对象的所有属性和对应的值。 这个错误通常发生在我们试图将一个不具备`__dict__`属性的对象作为参数传递给`vars()`函数时。这意味着该对象没有一个字典来保存其属性。例如,如果我们传递一个整数或一个函数作为参数,都会抛出这个错误。 正确的使用方法是,我们应该传递具有`__dict__`属性的对象给`vars()`函数。通常情况下,我们可以使用普通的自定义类的实例或内置的一些对象(如模块、类实例)作为`vars()`函数的参数。 要解决此错误,我们可以确保传递给`vars()`函数的对象具有`__dict__`属性。如果使用的是自定义类,可以在类定义中添加`__dict__`属性。对于一些内置的对象,我们可以直接使用。如果无法修改对象本身,我们可以考虑使用其他函数来获取对象的属性和值,例如`dir()`函数。这样我们就可以避免`vars()`调用时出现这个错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值