C# Python类工厂。。。或

C# Python类工厂。。。或,c#,python,C#,Python,我们有一个C语言的数据库库,可以这样使用: DatabaseConnection conn = DatabaseConnection.FromConnectionString("..."); 该库隐藏了不同数据库引擎之间的许多差异,如SQL函数名、参数名和规范等 在内部,DatabaseConnection类是一个实现一些基本方法的抽象类,但是FromConnectionString方法运行在一个已注册的专门类型列表中,这些类型处理实际的差异,并构造正确类的对象。换句话说,我没有取回Datab

我们有一个C语言的数据库库,可以这样使用:

DatabaseConnection conn = DatabaseConnection.FromConnectionString("...");
该库隐藏了不同数据库引擎之间的许多差异,如SQL函数名、参数名和规范等

在内部,DatabaseConnection类是一个实现一些基本方法的抽象类,但是FromConnectionString方法运行在一个已注册的专门类型列表中,这些类型处理实际的差异,并构造正确类的对象。换句话说,我没有取回DatabaseConnection对象,取而代之的是MSSQLSDatabaseConnection或OracleDatabaseConnection对象,它们当然是从DatabaseConnection继承的

连接字符串包含有关此连接的数据库引擎类型和版本的信息

我想用Python创建一个类似的库。制造可以这样构造的东西的正确方法是什么

conn = DatabaseConnection("...")
还是使用类方法

conn = DatabaseConnection.FromConnectionString("...")
第一个是可能的,那就是。。。根据传递的字符串中的数据,构造这样的对象并返回其他对象,一个专用对象

好吧,让我问一个不同的问题。。。什么是蟒蛇式的方法


我基本上也希望在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"
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中是可能的,但可能不是最好的方法。类工厂模式本质上是没有第一类的语言的变通方法。由于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"
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中,构造函数背后并没有太多的魔力。无论出于何种目的,它们都与任何其他函数一样。我曾多次使用此设计模式来指示不应直接实例化类,例如:

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"
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)

抱歉,这太冗长了,但我想说清楚。

第一个是绝对可能的,而且在我看来更可取。在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"
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)

很抱歉,这太冗长了,但我想说清楚。

Python不在乎为什么要返回

def DatabaseConnection( str ):   
    if ( IsOracle( str ) ):   
        return OracleConnection( str )  
    else: 
        return SomeOtherConnection( str )

Python不关心您返回的类型

def DatabaseConnection( str ):   
    if ( IsOracle( str ) ):   
        return OracleConnection( str )  
    else: 
        return SomeOtherConnection( str )

好的,嗯,不完全是我想的,但这给了我一个如何实现默认连接工厂的想法,也许我会使用这个想法,即使它不完全符合我想要的,谢谢。好的,嗯,不完全是我想的,但这给了我一个如何实现默认连接工厂的想法,也许我会使用这个想法,尽管它不完全符合我的要求,谢谢。谢谢,虽然你的和Glomeks都以某种方式回答了我的问题,但我不太喜欢这样重命名基类。有趣的是,你发布了这个想法,而我做了一个不需要命名类的编辑。如果这不起作用,请告诉我,我相信我可以在其他方面帮助你。谢谢,虽然你的和Glomeks都以某种方式回答了我的问题,但我不太喜欢必须像那样重命名基类。有趣的是,你发布了这个消息,而我做了一个不需要命名类的编辑。如果这不起作用,请告诉我,我相信我可以在其他方面帮助你。