2

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

4

2 回答 2

1

Jakob 的回答大多准确但不完整。如果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__方法,否则它会查找一个实例属性并使用它如果有,或者如果没有,则回退到使用类属性(即方法)。

__getattribute__如果定义了或,则查找可能会更加复杂__getattr__

于 2013-02-07T10:37:28.410 回答
1

这取决于先分配哪个。

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

例如

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

表明该方法覆盖了属性。

于 2013-02-07T09:24:11.070 回答