我想了解这两种语法之间的区别:
例如:
obj = {
'atrib1': 1,
'atrib2': 2
}
#accessing atrib1
print(obj['atrib1'])
#why can't I access like this, and what is accessible in this way?
#print(obj.atrib1)
答案 0 :(得分:1)
在Lua和JavaScript之类的语言中,您可以通过obj.attr
和obj["attr"]
访问的内容是相同的,您会注意到,用于操作字典的API实际上并不属于字典< em> object 。例如,如果要以列表的形式获取字典的键,则在JavaScript中,调用Objects.keys()
,并将字典作为参数传递。您不会拨打the_dictionary.keys()
。
这些是外部函数而不是成员函数的原因是,键/值字典中的键可能会覆盖成员函数。如果一个字典恰巧有一个名为“ keys”的键,则任何名为“ keys”的成员函数都将被覆盖。因此,作用于词典的函数不能是实际词典类型的成员。
在Python中,它们可以。字典的内容通过[]
访问,但是成员函数(作用于这些内容的操作)通过.name
表示法访问。那就是属性和“字段”之间的区别。这意味着对字典的操作实际上是在字典上的 。
您当然可以make them one and the same,但随后您会重新创建原始问题。而且由于Python通常不会出现该问题,因此它没有非成员函数,您可以轻松地调用它来完成该工作。您仍然可以通过class对象来执行此操作,但这显然不是Python的。
答案 1 :(得分:1)
在Python中,对象具有属性,可以使用.name
语法进行访问。但是某些对象类实现了__getitem__
方法,该方法可以用['name']
语法访问。最值得注意的是dict
类:
In [102]: obj = {
...: 'atrib1': 1,
...: 'atrib2': 2
...: }
...:
In [103]: type(obj)
Out[103]: dict
obj['atrib1']
由解释器翻译为方法调用:
In [104]: obj.__getitem__('atrib1')
Out[104]: 1
obj.atrib1
转换为__getattribute__
呼叫:
In [105]: obj.__getattribute__('atrib1')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-105-ec1bc68ae22d> in <module>
----> 1 obj.__getattribute__('atrib1')
AttributeError: 'dict' object has no attribute 'atrib1'
该类确实具有__getattribute__
和keys
之类的属性,它们是函数:
In [106]: obj.__getattribute__('__getitem__')
Out[106]: <function dict.__getitem__>
In [107]: obj.__getattribute__('keys')
Out[107]: <function dict.keys>
因此dict
对象确实具有很多属性,但是通过键访问的项不是属性。
某些类还实现了__dict__
属性,该属性存储用户定义的属性。 vars(obj)
将其作为字典返回。但是对于这个dict
类:
In [108]: vars(obj)
...
TypeError: vars() argument must have __dict__ attribute
这是一门兼具以下内容的小班课程:
In [111]: class mydict(dict):
...: pass
...:
In [112]: obj1 = mydict()
In [113]: obj1 = mydict(atrib1=1, atrib2=2)
In [114]: obj1
Out[114]: {'atrib1': 1, 'atrib2': 2}
In [115]: obj1.__dict__
Out[115]: {}
In [116]: obj1.foobar = 42
In [117]: vars(obj1)
Out[117]: {'foobar': 42}
In [118]: obj1.foobar
Out[118]: 42
In [119]: obj1['atrib1']
Out[119]: 1