首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python __init__ 方法深度解析:物件生命週期、參數形式多樣性、顯式初始化原則與多型設計

     編輯:更多程式設計知識

__init__ 是 Python 物件初始化的核心方法,決定實例建立後的初始狀態。本文從隱含超類 object 切入,探討初始化時機、參數靈活性、顯式優於隱式原則、繼承體系中 __init__ 協作與工廠函數演進。

隱含超類 object


class X: pass
X.__class__          # 
X.__class__.__base__ # 

所有類別隱含繼承 object,其 __init__ 預設為 pass。

預設行為與隱式屬性風險


class Rectangle:
    def area(self):
        return self.length * self.width

r = Rectangle()
r.length, r.width = 13, 8  # 執行期動態加入屬性
r.area()  # 104

雖合法但違反「顯式優於隱式」,易導致 AttributeError、if 'x' in self.__dict__ 防禦性程式碼。

超類 __init__ 協作模式


class Card:
    def __init__(self, rank, suit):
        self.suit = suit
        self.rank = rank
        self.hard, self.soft = self._points()

class NumberCard(Card):
    def _points(self):
        return int(self.rank), int(self.rank)

class AceCard(Card):
    def _points(self):
        return 1, 11

class FaceCard(Card):
    def _points(self):
        return 10, 10
  • 父類 __init__ 統一初始化共同屬性
  • 子類實作 _points() 多型方法
  • 建立實例:AceCard('A', '♠')

__init__ 建立常數物件


class Suit:
    def __init__(self, name, symbol):
        self.name = name
        self.symbol = symbol

Club, Diamond, Heart, Spade = (
    Suit('Club', '♣'), Suit('Diamond', '♦'),
    Suit('Heart', '♥'), Suit('Spade', '♠')
)

cards = [AceCard('A', Spade), NumberCard('2', Spade)]
  • 模組載入時建立單例常數
  • 策略/狀態模式的靜態物件池
  • Python 無真正不可變機制,但慣例視為常數

參數形式多樣性

形式範例適用場景
位置參數Card('A', '♠')固定順序、少量參數
關鍵字參數Card(rank='A', suit='♠')參數多、順序易混、預設值
*args/**kwargsdef __init__(self, *a, **kw)框架基類、參數透傳
Builder 模式CardBuilder().rank('A').suit('♠').build()複雜建構、可選步驟

工廠函數演進


# 簡單工廠
def create_card(rank, suit):
    if rank == 'A': return AceCard(rank, suit)
    elif rank in 'JQK': return FaceCard(rank, suit)
    else: return NumberCard(rank, suit)

# 類方法工廠
class Card:
    @classmethod
    def from_string(cls, s):  # "AS", "10H"
        rank, suit = s[:-1], s[-1]
        return create_card(rank, suit)

最佳實踐總結

  • 在 __init__ 顯式初始化所有實例屬性
  • 避免 if 'attr' in self.__dict__ 防禦性檢查
  • 父類 __init__ 處理共同初始化,子類擴充
  • 複雜建構邏輯提煉為工廠函數/類方法
  • 常數物件在模組層級建立,避免重複實例化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved