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
#但易混淆現在用的是
#類別變數還是物件變數
輸出結果:
c1,c2兩個不同物件
共用PI這個類別變數:
類別變數trick = [] (空list)
是錯誤用法
假設之後有function
可以為類別變數trick增加元素
類別變數將會讓所有
同類別的物件共用
class Dog:
正確應該d1有自己的trcik
d2也有自己的trick
因為錯誤地使用類別變數
d1.trick 跟 d2.trick都一樣:
推薦hahow線上學習python: https://igrape.net/30afN
在定義一個方法時,如果希望這個方法與類別本身有關,而不是與實例物件有關,就可以使用 @classmethod
來定義 class method。
class method 的特點是第一個參數是類別本身,慣例使用 cls
作為參數名稱。這個參數可以讓你存取類別屬性或調用類別方法。
使用 class method 有幾個好處:
-
類別方法可以直接被類別本身呼叫,而不需要先建立實例物件,這樣可以讓程式碼更加簡潔和易讀。
-
類別方法可以存取和操作類別屬性,而一般的物件方法只能存取和操作實例物件的屬性。
-
類別方法也可以作為工廠方法,用來建立新的實例物件。
總之,使用 class method 可以讓你在需要與類別本身有關的方法中,更好地表達你的意圖,提高程式碼的可讀性和可維護性
area
和 circumference
方法轉換為類別方法,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 中,可以使用 @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