Re: py oop

作者: sustainer123 (caster)   2024-09-18 17:24:58
※ 引述《sustainer123 (溫水佳樹的兄長大人)》之銘言:
: ※ 引述《sustainer123 (溫水佳樹的兄長大人)》之銘言:
: : Instance Methods
: : 實例方法 就class最常見那個
: : def foo(self)
: : 要有物件實例才能運行
: : 也就是說:
: : class.foo() #type error
: : obj = clsss()
: : obj.foo() #ok
: : 實例方法就是把實例本身傳給參數
: : obj.foo() == foo(obj)
: : 透過self 實例方法可以修改同一對象的屬性
: : Class Methods跟Static Methods明天再寫
: : 反正我文章也還沒看完
: 沒寫好 修改一下
: 實例方法可以修改類變量也能修改實例變量
: ex:
: class Test(object):
: class_attribute = 0
: def __init__(self, value):
: self.instance_attribute = value
: def instance_method(self):
: self.instance_attribute += 1
: Test.class_attribute += 1
: if __name__ == '__main__':
: print(Test.class_attribute) # 0
: t1 = Test(10)
: t1.instance_method()
: print(t1.class_attribute) # 1
: print(t1.instance_attribute) # 11
: t2 = Test(0)
: t2.instance_method()
: print(t1.class_attribute,t2.class_attribute) #2 2
: 大抵如此 不同實例共用類變量 然後能直接改類變類
: 但不同實例不共用實例變量
: classmethods
: 類方法
: py透過裝飾器實現
: @classmethods
: 類方法就把類丟進參數
: 以上面的code當例子
: 假設類方法為class_methods()
: 你可以t1.class_methods()
: 也可以Test.class_methods()
: 實際上傳入的參數長這樣:
: class_methods(<class '__main__.Test'>)
: 類方法就是把類本身丟進參數
: 他可以直接修改類變量 但不能直接修改實例變量
: 假如你希望類方法修改實例變量 你必須傳遞實例做為類方法的參數
: 大概這樣ㄅ staticmethod起床再說
staticmethod
靜態方法
簡單來說 就是不需要傳入類也不需要傳入實例但綁在的函數
py用裝飾器實現
@staticmethod
AbstractMethods
抽象方法
有抽象方法的抽象類不能被實例化
只能被子類繼承
而且子類必須覆寫(override)抽象方法
否則會噴error
拿我前幾天寫的東西當例子:
class OrderConverter(ABC):
@abstractmethod
def convert(self, order_data):
pass
class SimpleOrderConverter(OrderConverter):
def convert(self, order_data):
if order_data['currency'] == "USD":
try:
order_data['price'] = str(int(order_data['price']) * 31)
except ValueError:
raise ValueError("價格轉換失敗")
return order_data
建立抽象方法的方式就是class繼承ABC(Abstract Base Class)
然後在方法上掛上@abstractmethod
子類別必須實現convert() 否則會報錯
使用時機
實例方法:就 oop最基本的 也沒啥特定時機
靜態方法:獨立於實例外的輔助方法 老實講我感覺直接寫函數也差不多
類方法:可以取得類變數的靜態方法ㄅ 老實說我沒用過
抽象方法:
我多打這段就是為了它
假設原本有三個類A B C 三者都要實現foo()
直觀上 我們可以讓B繼承A C繼承B
但是 假設有天我們更改A BC就會連帶受影響
我們改用抽象方法
定義一個抽象類 裡面有抽象方法foo()
讓A B C繼承抽象類 A B C
直觀上 我們可以想成原先的繼承關係是一種鏈狀關係
抽象方法則變成一個中心 底下為平行關係
其實就多型 姆咪

Links booklink

Contact Us: admin [ a t ] ucptt.com