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 шт):
Не совсем понимаю, что вы хотите, но вот вам рабочий вариант первого кода:
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, которая один раз используется для вычисления результата, а второй раз для получения побочных эффектов - я не понял, но придумал пример, с которым этот код хотя бы не ругается.