方法和属性

时间:2013-02-07 09:22:45

标签: python class methods

我想知道,如果方法和属性在类中具有相同的名称会发生​​什么。程序是否会首先在对象中搜索属性,如果类中的方法具有相同的名称,程序是否会跳过它并只关注对象?

2 个答案:

答案 0 :(得分:1)

取决于首先分配哪一个。

如果首先分配方法,则该属性将是您要访问的属性,

e.g。

class Example(object):
    def __init__(self):
        self.x = 44

    def x(self):
        return "hi"

print Example().x

处理类时,方法被“分配”,其中x在初始化时分配。这意味着x会覆盖该方法。

这对于类级别属性当然是不同的,因为它们与方法

同时分配
class Example(object):
    x = 43

    def x(self):
        return "hi"

print Example().x

显示该方法会覆盖该属性。

答案 1 :(得分:1)

雅各布的答案大多准确但不完整。如果类中定义的x遵循描述符协议并定义了__get____set__方法,那么它将继续优先于任何' x'在实例字典中。最简单的方法是使用property

>>> class Example(object):
    def __init__(self):
        self.x = 44

    @property
    def x(self):
        return "hi"
    @x.setter
    def x(self, value):
        self.__dict__['x'] = value


>>> Example().x
'hi'
>>> Example().__dict__['x']
44

所以实际的规则是Python在类(及其基础)中查找,如果它找到匹配的对象并且对象具有__get__方法(或__set__如果设置)那么它调用__get__方法,否则它会查找实例属性,如果有,则使用该属性,如果没有,则使用class属性(即方法)。

如果定义__getattribute____getattr__,查找可能会更复杂。