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 - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- javascript 靜態方法和例項方法例項JavaScript
- Python常見面試題006 類方法、類例項方法、靜態方法有何區別?Python面試題
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- [Python 基礎] Python 例項方法、靜態方法和類方法詳解 (包含區別和用法)Python
- js--Object的靜態方法和例項方法JSObject
- Python 靜態方法和類方法的區別Python
- Python的靜態方法和類成員方法Python
- javascript的靜態方法和例項方法簡單介紹JavaScript
- 你真的瞭解靜態方法與例項方法的區別麼?
- 靜態方法和例項方法的區別以及如何恰當使用
- c#通過反射動態執行類的例項及靜態方法C#反射
- vue 快速入門 系列 —— 例項方法(或 property)和靜態方法Vue
- Python (類)例項方法的特殊屬性Python
- Java的方法靜態方法Java
- 類的靜態屬性和方法
- net 靜態方法與非靜態方法
- 物件導向2--靜態方法、類方法、屬性方法物件
- Java靜態方法和例項方法 java中的陣列作為形參傳入Java陣列
- 靜態方法查詢類名
- Python中類方法和例項方法有什麼區別?Python
- Java開發筆記(六十四)靜態方法引用和例項方法引用Java筆記
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- 靜態方法
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- 『無為則無心』Python物件導向 — 58、類方法和靜態方法Python物件
- 微課|中學生可以這樣學Python(7.3.3節):成員方法、類方法、靜態方法Python
- JNI/NDK開發指南(6):C/C++訪問Java例項方法和靜態方法C++Java
- Java類、物件以及(靜態)方法的探討Java物件
- 理解Python中的類物件、例項物件、屬性、方法Python物件
- Python的靜態方法和類成員方法都可以被類或例項訪問,兩者概念不容易理清,但還是有區別的Python
- 初學Python過程中,例項方法和類方法的區別是什麼?Python
- javaSE-day04--ArrayList基本用方法、類內定義方法和方法過載、靜態方法static(類的方法)、工具方法(static)的定義和使用Java
- 靜態變數與靜態方法變數
- Object上的靜態方法Object
- static靜態方法的使用
- 介面中的預設方法與靜態方法