Python. Как использовать переменную экземпляра класса в дочернем классе

как правильно использовать переменную q экземпляра родительского класса A при вызове метода internalFunction1 в дочернем классе B? Гугл не помог, уже и методом тыка не получается. Но если методы класса B перенести в метод класса А, то все работает.

class A():
    def __init__(self, a,b):
        self.q = externalFunction(a,b)

    def internalFuction1(self, a, b)
        externalFunction(self.q, a, b)
class B(A):
    def internalFuction1(self, a, b):
        A.internalFuction1(???, a, b)  # ??? == super(B, self).A.q  ??

конкретный пример

class sqldb:
    def __init__(self, server_name, database):
        try:
            self.conn = pyodbc.connect('Driver={SQL Server};'
                                  'Server=' + server_name + ';'
                                  'Database=' + database + ';'                                               
                                  'Trusted_Connection=yes;')
        except Error as e:
            print(f"The error '{e}' occurred")
            # sys.exit()

    def exec_query(self, query):
        cursor = self.conn.cursor     #  <---error. Solution: need ()
        try:
            cursor.execute(query)
            self.conn.commit()
        except Error as e:
            print(f"The error '{e}' occurred")

class Client(sqldb):
    # sql table column names in order
    col_name = ['id', 'phone', 'operator_code', 'time_zone', 'tag']
    _cols ='('
    for _s in col_name: _cols += "'" + _s + "', "
    _cols = _cols[0:-2] + ') '

    def add(self, id, phone, operator_code, time_zone='+00:00', tag='NULL'):
        arr = sqldb.exec_read_query(???, 'Select * from Client where ' + Client.col_name[0] +
                                    "'= " + str(id) + ' or phone=' + str(phone))
        if len(arr) != 0:
            print('User with this id or phone already exists')
            return
        query = 'Insert into Client' + Client._cols + 'values ('
        query += str(id) + ", '" + str(phone) + "' ,'" + str(operator_code) + " ',' " + str(
            time_zone) + " ',' " + str(tag) + "' )"
        sqldb.exec_query(???, query)

При выполнении client.add('3', '88885553535', '800', '+10:00', 'tax') python ругается, что ожидался обязательный аргумент query, т.е. указанный он посчитал за conn. Поясните, пожалуйста, почему Client наследуя sqldb не может передать/подставить автоматически значение conn. Как его вытащить?


Ответы (1 шт):

Автор решения: CrazyElf

Не совсем понимаю, что вы хотите, но вот вам рабочий вариант первого кода:

class A():
    def __init__(self, a,b):
        self.q = externalFunction(a, b)

    def internalFuction1(self, a, b):
        externalFunction(self.q, a, b)

class B(A):
    def internalFuction1(self, a, b):
        A.internalFuction1(self, a, b)

externalFunction = lambda *x: print(x)
b = B(1, 2)
b.internalFuction1(3, 4)

Вывод:

(1, 2)
(None, 3, 4)

Дело в том, что A.internalFuction1 - это вызов метода не экземпляра класса, а самого класса, поэтому там self сам никакой не передастся, его нужно передать вручную. И да, self.q у экземпляра класса B есть точно так же, как у его родителя A.

Что там за странная externalFunction, которая один раз используется для вычисления результата, а второй раз для получения побочных эффектов - я не понял, но придумал пример, с которым этот код хотя бы не ругается.

→ Ссылка