Что не так с тем списком клиентов, который у вас уже есть?Вы можете получить доступ к клиентам как clients[0]
, clients[1]
и так далее.Список является абстракцией для произвольного множества переменных.Списки индексируются 0, поэтому первый элемент имеет индекс 0
.Это может сбивать с толку, особенно потому, что некоторые языки, такие как R, FORTRAN или Wolfram Language, индексируются 1.Я не считаю это фундаментальной проблемой, вам просто нужно прояснить ситуацию.Если это действительно беспокоит вас, вы можете использовать dict
с числовыми индексами и просто сопоставить любой индекс, который вы хотите, с клиентом.
Также я бы сделал read_clients
бесплатной функцией.Он не использует ничего, кроме открытого API класса Client
для работы.Поэтому он не должен быть функцией-членом.Но если вы хотите, чтобы он был в этом классе, сделайте его @staticmethod
хотя бы потому, что он не привязан к одному конкретному Client
.
Что я имею в виду с открытым API: каждый класс, который вы пишете, имеетпубличные методы и частные методы.В Python нет спецификаторов доступа, но соглашение состоит в том, что методы, начинающиеся с подчеркивания (_
), не должны использоваться извне.Те, которые имеют два подчеркивания (например, __init__
), также не должны вызываться напрямую, а называются синтаксическим сахаром.Вы хотите иметь целенаправленные методы ( SRP ), поэтому используйте как можно меньше открытых функций.Также учтите следующее: скажем, кто-то хочет использовать ваш класс Client
для чтения файлов другого формата с именами пользователей и паролями.Этот человек должен будет изменить ваш код , чтобы добавить еще один метод read
.Но если функция read_clients
была внешней и просто использовала __init__
вашего Client
класса, то кто-то мог бы просто добавить новую свободную функцию где-нибудь.Это OCP .
И Client
может быть просто collections.NamedTuple
.Вот так:
import collections
Client = collections.namedtuple('Client', ['username', 'password'])
def read_clients(filename):
clients = []
# open file
# loop over all lines in the list
# Parse the username and password.
username = # …
password = # …
client = Client(username, password)
clients.append(client)
return clients
Вам не нужно определять класс Client
самостоятельно, и все Client
объекты (скажем, client
) будут иметь атрибуты client.username
и client.password
.
Использование password
и username
не является проблемой, поскольку параметр __init__
находится в другой области видимости.Доступ к членам вашего класса возможен только через self.
, так что это тоже не проблема.
Если вы действительно хотели динамически создавать переменные, есть способы сделать это, см. Здесь .Но опять же, вы хотите абстрагироваться от фактического количества клиентов, и для этого предназначен список.