属性和字段之间有什么区别?

时间:2019-06-23 20:53:14

标签: python python-3.x

我想了解这两种语法之间的区别:

例如:

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)

2 个答案:

答案 0 :(得分:1)

在Lua和JavaScript之类的语言中,您可以通过obj.attrobj["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