方法鏈(Method Chaining)是一種允許我們將多個方法連續呼叫的程式設計技巧,通常用於提升程式碼的簡潔性與可讀性。透過方法鏈,我們可以在一行程式碼中連續執行多個方法,不必多次引用同一個物件。
方法鏈的核心在於,每個方法在執行完畢後都返回 self,即方法的呼叫對象本身,從而允許我們在同一個物件上不斷地呼叫其他方法。
舉例來說,如果有一個操作字串的類別,我們可以使用方法鏈的方式來連續呼叫 .strip(), .lower(),以及 .replace() 方法,達到對字串進行多步驟操作的效果。方法鏈的應用常見於建構函式(Builder Pattern)、數據處理、以及設定物件屬性等場合,讓程式碼變得更為簡潔、直觀。
接下來,我們來練習方法鏈的應用:
class Draw:
def pick(self):
print("在挑選顏色")
return self #回傳物件本身
def use(self):
print("在挑選筆尖粗細")
return self
def take(self):
print("拿起畫筆")
return self
def down(self):
print("放下畫筆")
return self
draw = Draw()
draw.pick().use().take().down() #方法鏈
super()是用於在子類別中呼叫父類別方法的內建函式,常用於繼承情況下。通常,我們會在子類別的__init__方法中使用。
super().init() 是來呼叫父類別的初始化方法,確保父類別的屬性和設定能夠被執行。super() 也可用於呼叫父類別的其他方法,確保所有父類別的方法都按正確順序執行。這使程式碼更簡潔、易於維護,並促進類別間的重用。
以下是範例:
class Rectengle:
def __init__(self, length, width)
self.length = length
self.width = width
print("矩形初始化已執行")
class Square(Rectengle):
def __init__(self, length, width):
super().__init__(length, width)
print("正方形初始化已執行")
class Cube(Rectengle):
def __init__(self, length, width, height):
super().__init__(length, width)
self.height = height
print(f"立方體的長寬高是{height}, {width}, {height}")
square = Square(500, 500)
cube = Cube(10, 20, 30)
在 Python 中,物件可以作為引數傳遞給函式或方法。當我們將物件作為引數傳遞時,函式可以直接訪問並修改這個物件的屬性和方法,對於可變物件(如列表、字典、自訂類別的物件)也是如此。
這使我們能夠在函式中操作原始物件,而不需要在不同作用域間複製資料,從而提高效能和記憶體利用效率。
此外,透過將物件作為引數,我們可以將相關的資料和行為封裝在一起,讓函式能夠處理更複雜的資料結構,並增強程式的靈活性與可讀性。
以下是用物件為引數的範例:
class Flower:
color = None
def change_color(flower, color)
flower.color = color
flower1 = Flower()
flower2 = Flower()
flower3 = Flower()
print(flower1.color)
print(flower2.color)
print(flower3.color)
change_color(flower1, "red")
change_color(flower2, "blue")
change_color(flower3, "yellow")
print(flower1.color)
print(flower2.color)
print(flower3.color)
Python 中的鴨子型別(Duck Typing)是一種動態型別概念,其物件型別由行為或方法屬性來決定,並不是繼承關係或具體型別。
它源自於一句諺語:「如果它走起來像鴨子,叫起來也像鴨子,那它就是鴨子。」
只要物件具備需要的方法或屬性,即符合要求,可以當作同一類別使用,無需強制繼承特定類別。利用這種特性,函式可以處理不同型別的物件,只要它們具備必要的行為即可,更具彈性和通用性。
讓我們看看鴨子型別的範例:
class Duck:
def walk(self):
print("鴨子在走路")
def talk(self):
print("鴨子在說話")
class chicken:
def walk(self):
print("雞在走路")
def talk(self):
print("雞在說話")
class Person():
def catch(self, duck):
duck.walk()
duck.talk()
duck = Duck()
person = Person()
person.catch(duck)
chicken = Chicken()
person = Person()
person.catch(chicken)