Python Class 的例項方法/類方法/靜態方法
1. 定義
例項方法、類方法、靜態方法
class MyClass(object):
class_name = "MyClass" # 類屬性, 三種方法都能呼叫
def __init__(self):
self.instance_name = "instance_name" # 例項屬性, 只能被例項方法呼叫
self.class_name = "instance_class_name"
def get_class_name_instancemethod(self): # 例項方法, 只能通過例項呼叫
# 例項方法可以訪問類屬性、例項屬性
return MyClass.class_name
@classmethod
def get_class_name_classmethod(cls): # 類方法, 可通過類名.方法名直接呼叫
# 類方法可以訪問類屬性,不能訪問例項屬性
return cls.class_name
@staticmethod
def get_class_name_staticmethod(): # 靜態方法, 可通過類名.方法名直接呼叫
# 靜態方法可以訪問類屬性,不能訪問例項屬性
return MyClass.class_name
def instance_visit_class_attribute(self):
# 例項屬性與類屬性重名時,self.class_name優先訪問例項屬性
print "例項屬性與類屬性重名時,優先訪問例項屬性"
print "self.class_name:", self.class_name
print "MyClass.name:", MyClass.class_name
if __name__ == "__main__":
MyClass.class_name = "MyClassNew"
intance_class = MyClass()
print "instance method:", intance_class.get_class_name_instancemethod()
print "class method:", MyClass.get_class_name_classmethod()
print "static method:", MyClass.get_class_name_staticmethod()
intance_class.instance_visit_class_attribute()
執行效果
instance method: MyClassNew
class method: MyClassNew
static method: MyClassNew
例項屬性與類屬性重名時,優先訪問例項屬性
self.class_name: instance_class_name
MyClass.name: MyClassNew
2. 區別
例項方法
屬於例項的方法
只能通過例項名.方法名呼叫。
其可以訪問類屬性、例項屬性,類方法、例項方法、靜態方法。類方法
屬於類類的方法
可以通過例項名.方法名,也可以類名.方法名
其不能訪問例項屬性和例項方法靜態方法
和類方法很相似,不同的時候定義時要定義(cls)引數
可以通過例項名.方法名,也可以類名.方法名
其不能訪問例項屬性和例項方法
3. 靜態方法與類方法
這兩者非常像,都是源於C++或JAVA中static的思想。不過我覺得,python的靜態方法是從c++和java進化時的一個不完全產物。儘量使用類方法,不使用靜態方法。
python的例項屬性、類屬性對應c++或java中的非靜態屬性和靜態屬性
python的例項方法、類方法對應c++或java中的非靜態方法和靜態方法
下面是一個類方法比靜態方法牛逼的地方
class Color(object):
_color = (0, 0, 0);
@classmethod
def value(cls):
if cls.__name__== 'Red':
cls._color = (255, 0, 0)
elif cls.__name__ == 'Green':
cls._color = (0, 255, 0)
return cls._color
class Red(Color):
pass
class Green(Color):
pass
class UnknownColor(Color):
pass
red = Red()
green = Green()
xcolor = UnknownColor()
print 'red = ', red.value()
print 'green = ', green.value()
print 'xcolor =', xcolor.value()
相關文章
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- Python常見面試題006 類方法、類例項方法、靜態方法有何區別?Python面試題
- [Python 基礎] Python 例項方法、靜態方法和類方法詳解 (包含區別和用法)Python
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- 靜態工廠方法和例項工廠方法
- 你真的瞭解靜態方法與例項方法的區別麼?
- 靜態方法和例項方法的區別以及如何恰當使用
- vue 快速入門 系列 —— 例項方法(或 property)和靜態方法Vue
- Python中類方法和例項方法有什麼區別?Python
- 例項 靜態 類
- Java靜態方法和例項方法 java中的陣列作為形參傳入Java陣列
- Java的方法靜態方法Java
- Java開發筆記(六十四)靜態方法引用和例項方法引用Java筆記
- 類的靜態屬性和方法
- net 靜態方法與非靜態方法
- 理解Python中的類物件、例項物件、屬性、方法Python物件
- 『無為則無心』Python物件導向 — 58、類方法和靜態方法Python物件
- 靜態方法
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- python例項方法中self的作用Python
- 微課|中學生可以這樣學Python(7.3.3節):成員方法、類方法、靜態方法Python
- 初學Python過程中,例項方法和類方法的區別是什麼?Python
- Java類、物件以及(靜態)方法的探討Java物件
- 靜態域與靜態方法
- 管理 Windows 例項的高效方法 —— 使用 WindowExtensions 類Windows
- javaSE-day04--ArrayList基本用方法、類內定義方法和方法過載、靜態方法static(類的方法)、工具方法(static)的定義和使用Java
- php例項化物件的例項方法PHP物件
- TypeScript 中 class 的例項成員與靜態成員TypeScript
- 介面中的預設方法與靜態方法
- Object上的靜態方法Object
- static靜態方法的使用
- python入門基礎(14)--類的屬性、成員方法、靜態方法以及繼承、過載Python繼承
- python中time庫的例項使用方法Python
- java中String類常用方法的使用與例項Java
- ES6中類的靜態方法=> static 的使用
- Python靜態方法,其實暗藏玄機Python
- 16 ##### 適合靜態方法的場景:方法中不使用物件的值,則直接使用靜態方法物件
- 詳解Python物件導向程式設計之類、例項、方法Python物件程式設計
- python呼叫方法必須例項化麼Python