[英]Python class factory ... or?
我們在 C# 中有一個數據庫庫,我們可以這樣使用:
DatabaseConnection conn = DatabaseConnection.FromConnectionString("...");
該庫隱藏了不同數據庫引擎之間的許多差異,例如 SQL 函數名稱、參數名稱和規范等。
在內部, DatabaseConnection
類是一個抽象類,實現了一些基本方法,但FromConnectionString
方法運行在處理實際差異的已注冊專用類型列表中,並構造正確類的對象。 換句話說,我沒有取回 DatabaseConnection 對象,而是取回了 MSSQLDatabaseConnection 或 OracleDatabaseConnection 對象,它們當然是從 DatabaseConnection 繼承的。
連接字符串包含有關此連接適用於哪種數據庫引擎和版本的信息。
我想在 Python 中創建一個類似的庫。 制作可以像這樣構造的東西的正確方法是什么?
conn = DatabaseConnection("...")
或使用類方法?
conn = DatabaseConnection.FromConnectionString("...")
第一個甚至是可能的,也就是說......構造一個這樣的對象並取回其他東西,一個專門的對象,取決於傳遞的字符串中的數據?
好吧,讓我問一個不同的問題......這樣做的pythonic方法是什么?
我基本上也希望在 Python 中擁有 DatabaseConnection 基類,實現通用方法,並專門研究派生類,並在某處擁有基於連接字符串構造並返回正確類型的對象的方法或函數。
這在 Python 中是可能的,但可能不是最好的方法。 類工廠模式本質上是一種針對沒有一流類的語言的解決方法。 由於 Python 確實有一流的類,您可以將一個類存儲在一個變量中,並直接使用該類來創建實例。 要更改創建的類,請在變量中存儲不同的類。
例如:
class class1:
def greet(self):
print "hi"
class class2:
def greet(self):
print "hello"
maker = class1
obj1 = maker()
maker = class2
obj2 = maker()
obj1.greet() # prints "hi"
obj2.greet() # prints "hello"
Python 不在乎你為什么要返回類型。
def DatabaseConnection( str ):
if ( IsOracle( str ) ):
return OracleConnection( str )
else:
return SomeOtherConnection( str )
第一個是絕對可能的,在我看來更可取。 在python中,構造函數背后真的沒有很多魔法。 出於所有意圖和目的,它們就像任何其他功能一樣。 我已經多次使用這種設計模式來表明不應直接實例化一個類,例如:
def DatabaseConnectionFromString(connection_string)
return _DatabaseConnection(connection_string)
def DatabaseConnectionFromSomethingElse(something_else)
connection_string = convert_something_else_into_string(something_else)
return _DatabaseConnection(connection_string)
class _DatabaseConnection(object):
def __init__(self, connection_string):
self.connection_string = connection_string
當然,這是一個人為的例子,但這應該給你一個大致的想法。
編輯:這也是在 python 中繼承也不是那么不受歡迎的領域之一。 你也可以這樣做:
DatabaseConnection(object):
def __init__(self, connection_string):
self.connection_string = connection_string
DatabaseConnectionFromSomethingElse(object)
def __init__(self, something_else):
self.connection_string = convert_something_else_into_string(something_else)
對不起,這太冗長了,但我想說清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.