Python是从多个类读取数据并链接到主类对象的最佳方法

Python是从多个类读取数据并链接到主类对象的最佳方法,python,Python,导入cx_Oracle 从cx\U Oracle导入数据库错误 DBconnection类: definit(自我,凭证): self.connectionString=“” self.credentials=凭证 self.msg='' def\uuu repr\uu(自): 返回“”。格式(self.msg、self.credentials) def connect_db(自): 尝试: self.connectionString=cx\u Oracle.connect(self.crede

导入cx_Oracle 从cx\U Oracle导入数据库错误

DBconnection类: definit(自我,凭证): self.connectionString=“” self.credentials=凭证 self.msg=''

def\uuu repr\uu(自):
返回“”。格式(self.msg、self.credentials)
def connect_db(自):
尝试:
self.connectionString=cx\u Oracle.connect(self.credentials)
除数据库错误外:
self.msg=“错误TNS:无侦听器”
其他:
self.msg=“连接成功”

你所要求的就是合成。只要在谷歌上搜索“python合成”,你就会发现很多例子和最佳实践。有许多不同的方法可以做到这一点。这里我给大家举两个小例子:

您可以通过硬编码依赖项来组合类之间的依赖项,如下所示:

# example classes
import cx_Oracle

class DBConnector():
    def __init__(self, credentials):
        self.credentials = credentials

    def connect(self):
        return cx_Oracle.connect(self.credentials)

class DataReader():
    def __init__(self, credentials):
        self.connector = DBConnector(credentials)

# run example
credentials = {
    "server": "my_server",
    "port": 123,
    "database": "my_db"
}

my_reader = DataReader(credentials)
connection = my_reader.connector.connect()
# example classes
class DBConnector():
    def __init__(self, credentials):
        self.credentials = credentials

    def connect(self):
        return cx_Oracle.connect(self.credentials)


class DataReader():
    def __init__(self, connector):
        self.connector = connector

# run example
credentials = {
    "server": "my_server",
    "port": 123,
    "database": "my_db"
}

connector = DBConnector(credentials)
my_reader = DataReader(connector)
connection = my_reader.connector.connect()
但是,您也可以注入依赖项。如果您想了解为什么它很酷,这被称为“依赖项注入”——但本质上它可以归结为这样一个事实:您可以创建许多不同的DBConnector类,DataReader将能够使用它们(例如,您可以创建第二个类DBConnectorMySQL来连接MySQL而不是oracle)。您可以按如下方式执行此操作:

# example classes
import cx_Oracle

class DBConnector():
    def __init__(self, credentials):
        self.credentials = credentials

    def connect(self):
        return cx_Oracle.connect(self.credentials)

class DataReader():
    def __init__(self, credentials):
        self.connector = DBConnector(credentials)

# run example
credentials = {
    "server": "my_server",
    "port": 123,
    "database": "my_db"
}

my_reader = DataReader(credentials)
connection = my_reader.connector.connect()
# example classes
class DBConnector():
    def __init__(self, credentials):
        self.credentials = credentials

    def connect(self):
        return cx_Oracle.connect(self.credentials)


class DataReader():
    def __init__(self, connector):
        self.connector = connector

# run example
credentials = {
    "server": "my_server",
    "port": 123,
    "database": "my_db"
}

connector = DBConnector(credentials)
my_reader = DataReader(connector)
connection = my_reader.connector.connect()

问题是什么?嗨,请建议实现上述代码的最佳方法。这是一个DBConnection类,它有_uinit__;()方法和这两个连接Oracle数据库的方法。我可以通过创建这个对象和打印对象来运行它。但我想把它调用到不同的DataReader类中,在这里我们与Oracle建立连接并读取数据。在这里,我们将连接字符串传递到这个类的uuu init_uuu()中。实现这种场景的最佳方法是什么,因为我无法将对象创建到其他类定义中,并将字符串传递到init方法中,然后使用方法connect_db进行连接?抱歉,我知道不清楚。当我创建DBconnection对象并将凭据传递到init时,上面的类是完全可执行的。抱歉,我知道这不清楚。当我创建DBconnection的对象并将凭据传递到init时,上面的类是完全可执行的。若我想从另一个类DataReader调用这个类,那个么如何在那个里创建对象,并将凭据传递到init呢?我的逻辑是在第二类中建立连接,然后在DataReader中使用sql查询读取数据。我可以在这做连接,但想保持在不同的类。我应该在DB连接中创建classmethod吗?我能做些什么改变?如何实现这样的场景?请帮助。请编辑您的问题,以便在不需要查看评论的情况下更清楚地回答您的问题?我会在下面给你一个答案Hanks Karl这太棒了。事实上,第一个解决方案代码是我正在寻找的。我是OOPs新手,希望应用更好的代码编写技术。希望为每个任务使用单独的类,并使用所需的任何内容,但缺少将所有内容一起使用的概念。你能分享一些帮助我理解如何编写更好代码的网址或文档/书籍吗?很难说。我很久以前就学会了这些原则,所以我对最新的资料并不了解。不过,您可以尝试以下内容:。或者在谷歌上搜索“python面向对象编程”、“python函数编程”、“python设计模式”