我想知道,如果方法和屬性在類中具有相同的名稱會發生什麼。程序是否會首先在對象中搜索屬性,並且如果類中的某個方法具有相同的名稱,程序是否會跳過它並只關注對象?方法和屬性
方法和屬性
回答
這取決於首先分配哪一個。
如果該方法首先分配,屬性將是一個你將訪問,
例如
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
一個簡單的方法來回答這個問題將是寫這樣一個類,看看會發生什麼。 –
方法只是字符串,整數,列表等對象。你認爲的「方法」只是一個屬性引用的對象。 –