Python

С предварительной заменой SQL на обычную запись в файл в эмуляторе "записной книжки" дело движется, только вот (...)

... как из __init__ получить количество переданных аргументов? Чтобы потом не писать в ручную что их 6, а len(то-то от того-то)...
 class Person: 
instances = []

def __init__(self, name, subname, sex, age, number, adress):
self.name = name
self.subname = subname
self.sex = sex
self.age = age
self.number = number
self.adress = adress
self.instances.append(self)

@staticmethod
def output():
inp = input('Введите искомую фамилию ')
test = False
for i in Person.instances:
if i.subname == inp:
test = True
print(f'имя {i.name} \nпол: {i.sex} \nвозраст: {i.age} \nномер: {i.number} \nадрес: {i.adress}')
if not test:
print('Фамилия не найдена')

@staticmethod
def append_obj_to_file():
with open('objects.txt', 'a+', encoding='utf-8') as file:
data = ''
queries = ['Имя: ', 'Фамилия: ', 'Пол: ', 'Возраст: ', 'Номер: ', 'Адрес: ']
for i in range(len(queries)):
data += (input(queries[i].strip()) + ' ')
file.write(data)
file.seek(0)
s = file.read()

@staticmethod
def read_db():
with open('objects.txt', encoding='utf-8') as file:
s = file.read().split(' ')
res = []
for i in range(0, len(s) - 5, 6):
res += [s[i: i + 6]]
return res

@staticmethod
def create_objects():
s = Person.read_db()
for i in s:
obj = Person(*i)


Person.append_obj_to_file()
Person.append_obj_to_file()
Person.append_obj_to_file()
Person.create_objects()
Person.output()
Person.output()
ЛШ
Лев Шутов
5 840
Чтобы избежать повторения количества аргументов в классе Person и вместо этого динамически определить количество аргументов в конструкторе __init__, вы можете воспользоваться атрибутом __init__.__code__.co_argcount. Этот атрибут возвращает количество аргументов функции или метода.

В вашем коде это можно сделать следующим образом:

 class Person:  
instances = []
num_args = None # Переменная для хранения количества аргументов в конструкторе

def __init__(self, name, subname, sex, age, number, adress):
self.name = name
self.subname = subname
self.sex = sex
self.age = age
self.number = number
self.adress = adress
self.instances.append(self)

@staticmethod
def get_num_args():
if Person.num_args is None:
Person.num_args = Person.__init__.__code__.co_argcount - 1 # Исключаем self
return Person.num_args

# ... остальной код ...

@staticmethod
def append_obj_to_file():
with open('objects.txt', 'a+', encoding='utf-8') as file:
data = ''
queries = ['Имя: ', 'Фамилия: ', 'Пол: ', 'Возраст: ', 'Номер: ', 'Адрес: ']
num_args = Person.get_num_args() # Получаем количество аргументов
for i in range(num_args):
data += (input(queries[i].strip()) + ' ')
file.write(data)
file.seek(0)
s = file.read()

# ... остальной код ...

Person.append_obj_to_file()
Person.create_objects()
Person.output()
Ferahim Semedov
Ferahim Semedov
842
Лучший ответ
**kwargs лучше использовать, тогда параметры у тебя придут в виде словаря
MD
Mehmet Demir
76 768
Вы можете использовать *args вместо перечисления всех аргументов в __init__. Это позволит вам передавать любое количество аргументов в __init__. Вы можете получить количество переданных аргументов, используя len(args). Вот пример:
 class Person:  
instances = []

def __init__(self, *args):
self.name = args[0]
self.subname = args[1]
self.sex = args[2]
self.age = args[3]
self.number = args[4]
self.adress = args[5]
self.instances.append(self)
print(f'Количество переданных аргументов: {len(args)}')
Теперь, когда вы создаете экземпляр класса Person, вы можете передать любое количество аргументов, и они будут доступны в args внутри __init__. Вы также можете использовать len(args) для получения количества переданных аргументов.
AA
Alexandr Adami
25 860
Лев Шутов Для нейросети это может и нормально, но вменяемый человек так делать не будет. Всё равно нужно будет знать что аргументов именно 6 и пропадает весь смысл этого ботовского решения