doubtpoint
Есть, например, класс Goods выдающий информацию из базы данных.
Класс ничего не выдаёт. Класс описывает устройство каждого объекта, принадлежащего этому классу. Класс - это такое объединение одинаковых объектов в одно множество. Соответственно, у тебя может быть много объектов класса Goods, каждый из которых имеет собственное, индивидуальное взаимодействие с базой данных. И вот объект уже как раз и берёт и выдаёт информацию из базы данных. Но класс один и он ничего не делает, потому что его нет ни в памяти, ни во времени, а объектов этого класса много и каждый из них имеет место в памяти и время жизни, в течение которого его состояния меняются с одного на другое.
doubtpoint
Когда принято делать подключение к базе данных?
1) В основной программе, а в объект передавать идентификатор подключения.
Допустим Goods имеет два разных подключения к базе(один к локальной с описание товаров, а другой удаленный к сладу)
Подключением к базе данных может заниматься вообще другой объект. А каждый объект, описанный в классе Goods, может подключаться только к одной базе, которую ему подадут снаружи. И то ему подают эту базу данных не напрямую, а опосредованно, в качестве какого-то источника с данными. Объект класса Goods даже не в курсе, что это за источник и является ли он какой-то базой данных. Объект класса Goods просто знает про операции, которые можно совершать над объектом-источником. А объект-источник, в свою очередь, подключен к базе данных каким-то способом, которых может быть много. В том числе объект-источник может быть подключен вообще к нескольким базам данных одновременно. Никто об этом не будет знать. Просто операция над объектом-источником будет скрыто выполнять поиск в нескольких базах. А объект-клиент, выполняющий эту операцию над объектом-источником, просто будет получать данные и не знать ничего про то, откуда и каким образом эти данные получены.
Ты можешь подсоединить к объекту сначала одну базу данных, поработать с ней, а потом подсоединить к этому же объекту другую базу данных, поработать с ней, а потом подсоединить к этому же объекту третью базу данных, поработать с ней, и так далее. Для этого у тебя должна быть такая операция у объекта, через которую к нему можно подключить любую базу данных в любой момент. Соответственно, не нужно делать несколько соединений с разными базами данных в одном объекте. Надо просто подключать объект то к одной базе данных, то к другой базе данных. Также у тебя может быть два таких объекта, где первый подключен к одной базе данных, а второй ко второй базе данных. Их же можно и перенастраивать на другие базы данных в любой момент. И вот эти объекты, подключенные к разным базам данных, могут быть собраны в объекте-источнике как в едином источнике данных, которые можно запросить у него.
doubtpoint
3) Создать при вызове методов Goods, по мере необходимости. Тогда каждый запрос будет подключение/отключение, что создась большую нагрузку
Подключением к базе данных должен заниматься вообще другой объект. На нём же и лежит ответственность за снижение нагрузки при подключении к базе данных. Объект, работающий с данными из базы данных, просто должен общаться с объектом, который управляет подключением к базе данных, и получать от него объект для работы с базой данных и сохранять этот объект для работы с базой данных у себя в памяти.
Если уж ты взялся за классы и объекты, то у тебя должно быть соответствующее мышление. Не надо просто тупо в лоб подключаться к базе данных. Они могут варьироваться, они могут меняться, способы подключения к ним могут видоизменяться во времени. Очень глупо будет заносить в объект, который работает только с данными, информацию о 100500 возможных изменениях, которые могут произойти с самой базой данных. Там имя самой базы данных в СУБД поменяется и у тебя уже все объекты сломаются, хотя данные в базе данных никак не изменились.
Пример
>>> class Reader:
... def set_db(self, db):
... self.db = db
...
... def read(self):
... return self.db.query()
...
>>> class Connector:
... def connect(self, address, user, password):
... return DB(address, user, password)
...
>>> class DB:
... def __init__(self, address, user, password):
... self.address = address
... self.user = user
... self.password = password
...
... def query(self):
... return 'name=kate age=30'
...
... def status(self):
... return 'db<a={}, u={}, p={}>'.format(
... self.address, self.user, self.password)
...
>>> reader = Reader()
>>> db = Connector().connect('https://host', 'u', '!@#$')
>>> reader.set_db(db)
>>>
>>> status = db.status()
>>> print(status)
db<a=https://host, u=u, p=!@#$>
>>>
>>> result = reader.read()
>>> print(result)
name=kate age=30
>>>