2013-02-07 107 views
2

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

+0

这将是定义最新的 – Volatility

+0

一个简单的方法来回答这个问题将是写这样一个类,看看会发生什么。 –

+0

方法只是字符串,整数,列表等对象。你认为的“方法”只是一个属性引用的对象。 –

回答

1

这取决于首先分配哪一个。

如果该方法首先分配,属性将是一个你将访问,

例如

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

    def x(self): 
     return "hi" 

print Example().x 

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

这当然是用于类级不同的属性,因为它们是在同一时间指定为方法

class Example(object): 
    x = 43 

    def x(self): 
     return "hi" 

print Example().x 

表明,该方法将覆盖属性。

+0

谢谢!但是你说x在初始化时被赋值,这意味着该方法被首先赋值,所以应该打印Example()。x return hi?因为它被定义为最新的? – John

+0

理解这一点的重要关键是Python中的函数/方法本身就是对象。创建一个方法从根本上为一个属性赋值;它恰好是一个可调用的值。一旦你有了这样的理解,直接看到最后发生的任务“胜利”。 – GrandOpener

+0

“可以直接看到最后发生的任务”胜利“。”我理解你的意思,但是在上例中最后发生的任务,第一个是def x(self)...返回hi 。这就是为什么它应该打印出你好。因为这是最新的定义。 – John

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__,则查找可能会更加复杂。