我想知道,如果一个方法和一个属性在一个类中具有相同的名称会发生什么。程序是否会首先搜索对象中的属性,如果类中的方法具有相同的名称,程序是否会跳过它而只关注对象?
问问题
432 次
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 回答