Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod

加入好友
加入社群
Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

class Circle:
    PI=3.1415926 #類別變數
#在__init__() 之前

    def __init__(self,radius):
        self.r = radius
#物件變數
#r 跟radius用不同名稱比較不會混淆
#若用相同名稱,仍要知道
#slef.radius(class中引用)跟
#radius(class外使用者指定)不同

    def area(self):
       return __class__.PI * self.r **2
#用__class__.存取類別變數為佳
#Circle. (類別名稱)亦可
#但使用__class__.存取的話
#類別改名的話,不需要跟著修改

    def circumference(self):
        return 4* self.PI * self.r
#用self. 仍可存取類別變數PI
#但易混淆現在用的是
#類別變數還是物件變數

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

輸出結果:

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

c1,c2兩個不同物件

共用PI這個類別變數:

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

 

類別變數trick = [] (空list)

是錯誤用法

假設之後有function

可以為類別變數trick增加元素

類別變數將會讓所有

同類別的物件共用

class Dog:

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

正確應該d1有自己的trcik

d2也有自己的trick

因為錯誤地使用類別變數

d1.trick 跟 d2.trick都一樣:

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

推薦hahow線上學習python: https://igrape.net/30afN

在定義一個方法時,如果希望這個方法與類別本身有關,而不是與實例物件有關,就可以使用 @classmethod 來定義 class method。

class method 的特點是第一個參數是類別本身,慣例使用 cls 作為參數名稱。這個參數可以讓你存取類別屬性或調用類別方法。

使用 class method 有幾個好處:

  1. 類別方法可以直接被類別本身呼叫,而不需要先建立實例物件,這樣可以讓程式碼更加簡潔和易讀。

  2. 類別方法可以存取和操作類別屬性,而一般的物件方法只能存取和操作實例物件的屬性。

  3. 類別方法也可以作為工廠方法,用來建立新的實例物件。

總之,使用 class method 可以讓你在需要與類別本身有關的方法中,更好地表達你的意圖,提高程式碼的可讀性和可維護性

 
上例可以將 areacircumference 方法轉換為類別方法,
這樣在調用時就可以直接使用類別名稱來調用,
而不需要先實例化物件,如下所示:
class Circle:
PI=3.1415926 #類別變數

@classmethod
def area(cls, r):
    return cls.PI * r **2

@classmethod
def circumference(cls, r):
    return 4 * cls.PI * r


使用時可以直接透過類別名稱調用:

print(Circle.area(2)) # 12.5663704
print(Circle.circumference(2)) # 25.1327416

這樣的設計可以更明確地表示這些方法是屬於類別的,

而不是物件的。

如果這些方法不需要訪問物件屬性,

那麼使用類別方法會更適合。

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王
 

靜態方法是一個屬於類別的方法,它不需要使用到類別的屬性或方法,也不需要使用到實例的屬性或方法。因此,靜態方法可以被視為一個與類別和實例無關的方法。

在 Python 中,可以使用 @staticmethod 裝飾器來定義一個靜態方法。宣告一個靜態方法時,必須使用 @staticmethod 裝飾器標記它。

class Circle:
PI = 3.1415926

def __init__(self, radius):
self.r = radius

def area(self):
return Circle.PI * self.r ** 2

@staticmethod
def is_point_in_unit_circle(x, y):
distance_from_origin = (x ** 2 + y ** 2) ** 0.5
return distance_from_origin <= 1

Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

加入好友
加入社群
Python物件導向 (Object-oriented programming,簡稱OOP): 類別變數 __class__.PI ; 物件變數 self.PI ; 類別方法 @classmethod cls.PI ; 靜態方法 @staticmethod - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *