Не получается создать класс в python
Всем привет! Пытаюсь создать класс, чтобы чтобы при вводе положительного числа, оно добавлялось в список, а при вводе отрицательного программа писала, что число отрицательное.
Вот моё подобие кода:
class Spisok:
def append(self, x):
if x > 0:
Spisok.append(x)
else:
print('Число меньше 0')
lst = Spisok
lst.append(5)
Я в этом деле почти совсем нулячий, прочитал уже кучу статей и посмотрел кучу роликов по ооп, но до сих пор не могу понять даже азы. Пара вопросов:
- Надо ли здесь писать
def __init__(self)и зачем он нужен? Я читал что эта штука инициализирует класс, кто-то называет это конструктором класса, и я не понимаю нужен ли он, потому что часто его вообще не используют в лёгких программах. - Как сделать, чтобы можно было вводить сразу кучу чисел, я знаю про *args, но опять же не понимаю как это реализовать. Программа не даёт мне писать if *args > 0 =\
Заранее огромное спасибо! Очень хочу во всё разобраться честно!
Ответы (2 шт):
Метод __init__ выполняется при создании каждого нового экземпляра класса.
Грyбо говоря в твоём слyчае каждый раз при создани экземпляра класса Spisok, мы создаем пyстой список self.lst. Первый аргумент, self, он получает от интерпретатора, остальные передаются классу в круглых скобках при создании экземпляра.
class Spisok:
def __init__(self):
self.lst = []
def append(self, x):
if x > 0:
self.lst.append(x)
else:
print('Число меньше 0')
lst = Spisok()
lst.append(5)
lst.append(-5)
Есть еще вопросы?
Вам прямая дорога читать о магических методах и продолжать изучать ООП.
__init__ - инициализатор нового экземпляра.
Где использовать? Везде. Пока что.
К примеру у вас есть класс человека. У людей есть имена. Одно на всех? Нет. Так инициализатор решает это как лучший друг.
class человек(object):
расса = "человек он, вроде."
def __init__(self, name: str = "TobaSko"):
self.name = name
В этом случае для каждого человека мы передадим его индивидуальное имя. Имя (self.name) будет дано каждому экземпляру при его инициализации:
a = человек()
b = человек("Shamus_Rezol")
print(a.name, b.name, sep = " vs ")
TobaSko vs Shamus_Rezol
Конечно же, его можно поменять и после, но, в основном, только если у тебя нету инициализатора, что не очень то и удобно (ключевое слово: удобства):
class человек(object): pass
a = человек()
a.name = "Комментатор"
Звездочка знаменует то, что аргумент передастся как кортеж (tuple), а при сдвоеной как словарь (dict). После них бессконечность аргументов. Первый тип - просто аргументы. Второй тип - именованые аргументы (немножко = True).
def Ломай(*arguments, **options):
print(type(arguments), type(options), sep = "; ")
options.setdefault("немножко", False)
if options["немножко"]:
print("Совсем уж немножко ", end = str())
for argument in arguments:
print(argument, end = ' ')
print(str())# 2 NL (\n)
Ломай("изогнул шею", "и пробил болевой", немножко = True, не_бей_кома_обос = "передастся и будет в options, но попросту проигнорируется за отсутствием реализации")
<class 'tuple'>; <class 'dict'>
Совсем уж немножко изогнул шею и пробил болевой
Ваши лучшие друзья
Это type и dir. Нелепо обходить их стороной при изучении языка. Очень хорошие штуки, делающие штучки. Эксперименты, эмперический путь и только! Чуть не забыл. GOOGLE.COM тоже.