本文實例講述了Python工廠函數用法。分享給大家供大家參考,具體如下:
參考了很多代碼、別人的文章以及書籍,最后自己做了適合自己理解的一種理解總結方式。
很多人說,工廠函數看上去像函數,其實是類。我覺得這種方法有些牽強,雖說在OOP中Python有其自己對類以及對象的定義。在一定程度上這么說是可以的。
我個人的理解,既然叫做工廠函數,那么這一定是一個函數。不過,看了許多例子后發現,其實工廠函數基本上都是帶有返回對象的。而這些返回對象則是通過調用一種或者多種類來創建的對象。
例如,有如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#!/usr/bin/python class Card: def __init__( self ,rank,suit): self .suit = suit self .rank = rank self .hard, self .soft = self ._points() classNumberCard(Card): def _points( self ): returnint( self .rank), int ( self .rank) classAceCard(Card): def _points( self ): return 1 , 11 classFaceCard(Card): def _points( self ): return 10 , 10 class Suit: def __init__( self ,name,symbol): self .name = name self .symbol = symbol defcard(rank,suit): if rank = = 1 : return AceCard( 'A' ,suit) elif 2 < = rank < 11 : return NumberCard( str (rank),suit) elif 11 < = rank < 14 : name = { 11 : 'J' , 12 : 'Q' , 13 : 'K' }[rank] return FaceCard(name,suit) else : raise Exception( "Rank out ofrange" ) |
上面代碼中的card其實就是通過調用各種類來創建對象,而這個函數就是一個工廠函數。這種函數的設計,通常是為了滿足批量創建大量的對象或實例而創建。比如,創建所有的撲克牌對象可以通過如下代碼:
1
2
3
4
|
Club,Diamond,Heart,Spade = Suit( 'Club' , 'CCC' ),Suit( 'Diamond' , 'DDD' ),Suit( 'Heart' , 'HHH' ),Suit( 'Spade' , 'SSS' ) deck = [card(rank,suit) for rank in range ( 1 , 14 ) for suit in (Club,Diamond,Heart,Spade)] |
上面的代碼,首先創建了不同的花色,然后通過復合for語句創建了整套撲克牌。如果簡化一些,自然也可以把花色存儲到一個專門的元組或者列表中增強一下可讀性。
以上是我自己通過不同的資料、文檔、書籍以及代碼示例總結出的Python中工廠函數的理解以及使用方式。應該沒有太大偏差了吧?如果有的話,后續繼續糾正吧,畢竟學習本身應該是一條曲折的路線。
希望本文所述對大家Python程序設計有所幫助。
原文鏈接:https://blog.csdn.net/grey_csdn/article/details/74279346