我想知道,如果方法和属性在类中具有相同的名称会发生什么。程序是否会首先在对象中搜索属性,如果类中的方法具有相同的名称,程序是否会跳过它并只关注对象?
答案 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__
,查找可能会更复杂。