2015-06-21 95 views
5

的Python为我们提供了许多可能性的实例/类的属性,例如:什么是python属性get和set命令?

class A(object): 
    def __init__(self): 
     self.foo = "hello" 

a = A() 

有很多种方法访问/修改的self.foo值:

  1. 直接访问a.foo
  2. 内字典a.__dict__['foo']
  3. 得到和设置a.__get__a.__set__,当然有两个是预定义的方法。
  4. 的getAttribute a.__getattribute__
  5. __getattr____setattr__
  6. 也许更多。

在阅读源代码时,我总是迷失其最终的访问顺序?当我使用a.foo时,如何知道实际调用哪个方法/属性?

+1

1.'foo'是*实例属性*,不是类属性。 2.由于它不是'@属性'(或其他描述符),'__get__'和'__set__'不会涉及。 – jonrsharpe

+0

例如'__getattr__'与'__getattribute__',请参阅http://stackoverflow.com/q/3278077/3001761 – jonrsharpe

回答

6

bar = a.foo ...

  1. 调用a.__getattribute__('foo')
  2. 这反过来默认查找a.__dict__['foo']
  3. 或调用foo.__get__()如果A定义。

返回的值将被分配到bar


a.foo = bar ...

  1. 调用a.__getattribute__('foo')
  2. 这反过来默认查找a.__dict__['foo']
  3. 或调用foo如果A.
+0

很好解释。大。 – Fawzan

+0

这不太准确; '__get__'和'__set__'是描述符,它们存储在* class *中,因此不会在'a .__ dict__'中找到。 – jonrsharpe

+0

@jonrsharpe在技术上更加正确。 – Amber

1

定义的.__set__(bar)我发现this great post th在对象/类属性查找上有详细的解释。

对于对象属性查找:

假设类是类和实例是类的实例,评估instance.foobar大致相当于此:

  • 来电类的类型时隙。 getattribute(tp_getattro)。默认是这样的:
    • 是不是类。 字典有一个foobar项目是一个数据描述符?
      • 如果是,则返回Class的结果。 字典 ['foobar']。 得到(实例,类)。
    • 是否有实例。 字典有一个foobar项目吗?
      • 如果是,则返回实例。 字典 ['foobar']。
    • 是不是类。 字典有一个不是数据描述符的foobar项目[9]?
      • 如果是,则返回Class的结果。 字典 ['foobar']。 得到(实例,克拉斯)。 [6]
  • 如果属性仍然没有被发现,并有一个类。 getattr,调用Class。 getattr('foobar')。

有这个图示的图像:

enter image description here

请不要检查出原来的博客,如果有兴趣这给蟒蛇类优秀的解释,属性查询,和元类。