我想知道,如果方法和属性在类中具有相同的名称会发生什么。程序是否会首先在对象中搜索属性,并且如果类中的某个方法具有相同的名称,程序是否会跳过它并只关注对象?方法和属性
方法和属性
回答
这取决于首先分配哪一个。
如果该方法首先分配,属性将是一个你将访问,
例如
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
表明,该方法将覆盖属性。
谢谢!但是你说x在初始化时被赋值,这意味着该方法被首先赋值,所以应该打印Example()。x return hi?因为它被定义为最新的? – John
理解这一点的重要关键是Python中的函数/方法本身就是对象。创建一个方法从根本上为一个属性赋值;它恰好是一个可调用的值。一旦你有了这样的理解,直接看到最后发生的任务“胜利”。 – GrandOpener
“可以直接看到最后发生的任务”胜利“。”我理解你的意思,但是在上例中最后发生的任务,第一个是def x(self)...返回hi 。这就是为什么它应该打印出你好。因为这是最新的定义。 – John
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__
,则查找可能会更加复杂。
- 1. 类属性和方法
- 2. C#方法和属性
- 3. Html.DisplayFor和属性的方法
- 4. NSObject无法访问属性和方法
- 5. 只读属性,方法和点语法
- 6. Moq和虚拟属性和方法
- 7. 属性或方法?
- 8. 属性与方法?
- 9. 属性vs方法
- 10. 方法vs属性
- 11. C#方法属性
- 12. .net方法属性
- 13. 属性或方法?
- 14. 设置Cobol方法属性属性
- 15. 从e.PropertyName属性调用属性方法
- 16. 模拟修补方法和属性
- 17. Backbone.js中的共享方法和属性?
- 18. 包封物的属性和方法
- 19. 区分属性和方法同名
- 20. 属性设置器和方法DRY
- 21. Typescript动态属性和方法
- 22. 设置属性和on_done方法
- 23. Rational Software Architect方法和属性
- 24. Python的属性和方法__dict__
- 25. ActionName属性和UrlHelper.Action方法在ASP.NET MVC
- 26. 转储对象的方法和属性
- 27. javascript:属性和方法访问对象
- 28. 中继器.net属性和方法
- 29. angular2dart组件的属性和方法
- 30. 属性和方法数组的JavaScript
这将是定义最新的 – Volatility
一个简单的方法来回答这个问题将是写这样一个类,看看会发生什么。 –
方法只是字符串,整数,列表等对象。你认为的“方法”只是一个属性引用的对象。 –