【问题标题】:Python class inheritance - how to use this to connect to a mysql databasePython 类继承 - 如何使用它连接到 mysql 数据库
【发布时间】:2016-09-01 08:58:48
【问题描述】:

我正在使用 python 2.7,并且我编写了一组 python 类以便将数据上传到我的数据库。但是我不确定我是否完全理解如何使用从类到类的继承。我拥有的是一个用户和数据库类 - 它从列表中搜索用户/数据库:

class User(object):

    user_lst = ['user1', 'user2', 'user3']

    def __init__(self, username):
        self.username = username

    def find_user(self):
        if self.username not in self.user_lst:
            print('User not found, script will exit')
            exit()
        else:
            pass


class Database(object):

    db_lst = ['db1', 'db2', 'db3']

    def __init__(self, database):
        self.database = database

    def find_db(self):
        if self.database not in self.user_lst:
            print('Database not found, script will exit')
            exit()
        else:
            pass

我使用 raw_input() 返回用户和数据库的值:

un = 'user1'
db = 'db1'

按照我的理解,要实例化这些类,我需要通过类传递这些值,此时我也可以调用方法-

User(un).find_user()
Database(db).find_db()

我现在想使用第三个类来继承这些值以便连接到数据库:

class DatabaseConnect(User, Database):

    def __init__(self):
        User.__init__(self, username)
        Database.__init__(self, database)

    def connect(self, pw):
        try:
            connect = MySQLdb.connect(host = 'localhost', user = self.username, passwd = pw, db = self.database, local_infile = 1)
            cursor = connect.cursor()
            print('Connected to '+self.database)
        except:
            print('Did not connect to database')
            exit()

然后我尝试使用以下方式连接:

DatabaseConnect().connect('password1')

但是这不起作用。我试图添加到我的 DatabaseConnect 类 init 功能:

def __init__(self, username, database):
    User.__init__(self, username)
    Database.__init__(self, database)        

我也尝试过从这些类创建对象变量,例如:

user_obj = User(un)
user_obj.find_user()

db_obj = Database(db)
db_obj.find_user()

我是否需要创建这些对象变量,然后将它们传递给我的 DatabaseConnection 类 - 如果需要,我什至需要继承吗?这就是我感到困惑的原因。假设我使用这些对象变量并使用此类:

class DatabaseConnect(User, Database):

    def __init__(self, username, database):
        self.username = User.username
        self.database = Database.database

    def connect(self, pw):
        try:
            connect = MySQLdb.connect(host = 'localhost', user = self.username, passwd = pw, db = self.database, local_infile = 1)
            cursor = connect.cursor()
            print('Connected to '+self.database)
        except:
            print('Did not connect to database')
            exit()

然后我使用实例化它:

db_connect = DatabaseConnect(user_obj, db_obj) 

这与简单地使用变量本身有什么不同:

db_connect = DatabaseConnect(un, db) 

为什么我必须使用:

self.username = User.username

而不是简单地:

self.username = username

我正在努力理解这个概念,所以任何人都会受到赞赏。谢谢

【问题讨论】:

    标签: python mysql python-2.7 class inheritance


    【解决方案1】:

    如果您是继承,则不需要创建用户和数据库实例。您可以只创建一个 DatabaseConnect 对象:

    class DatabaseConnect(User, Database):
    
        def __init__(self, username, database):
            User.__init__(self, username)
            Database.__init__(self, database)
    
        def connect(self, pw):
            try:
                connect = MySQLdb.connect(host = 'localhost', user = self.username, passwd = pw, db = self.database, local_infile = 1)
                cursor = connect.cursor()
                print('Connected to '+self.database)
            except:
                print('Did not connect to database')
                exit()
    
    
    dbConnect = new DatabaseConnect("username", "database")
    
    dbConnect.find_db()
    Database not found, script will exit
    
    dbConnect.find_user()
    User not found, script will exit
    

    【讨论】:

    • 啊,提前 14 秒
    • 谢谢。但我还是很困惑。我不明白这样做有什么意义——因为如果不实例化我的用户和数据库类,我就不能调用 find_user() 和 find_database 方法,对吧?另外,这与简单地放入我的 DatabaseConnect 有什么不同: def __init__(self, username, database): 'self.username = username self.database = database 这会产生相同的结果吗?
    • 是的,你可以,你现在可以这样做 dbConnect.find_db() 和 dbConnect.find_user() 我更新我的答案
    • 当您实例化 DatabaseConnect 并调用 User 和 Database init 时,您也可以访问这些方法和属性
    • 我现在明白了!非常感谢!因此,基本上,当您调用从父类继承的子类时,您现在可以访问它们的方法 - 太棒了:D
    【解决方案2】:

    通过做:

    def __init__(self, username, database):
        self.username = User.username
        self.database = Database.database
    

    您没有正确初始化 UserDatabase 实例。您需要调用他们的__init__ 函数。有几种方法可以做到这一点,例如:

    def __init__(self, username, database):
        User.__init__(self, username)
        Database.__init__(self, database)
    

    这样做后你可以使用self.username

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2020-10-18
      • 1970-01-01
      • 2017-03-01
      • 2010-09-27
      相关资源
      最近更新 更多