Шта је __инит__ у Питхон-у? [With Examples]

Желите да почнете са објектно оријентисаним дизајном у Питхон-у? Предузмите прве кораке већ данас тако што ћете научити више о Питхоновом __инит__ методу.

У овом водичу ћемо проћи кроз основе Питхон класа и објеката, а затим наставити да учимо о методи __инит__.

До краја овог упутства моћи ћете да одговорите на следећа питања:

  • Шта су променљиве инстанце или атрибути инстанце?
  • Како инит метода помаже у иницијализацији атрибута инстанце?
  • Како можемо поставити подразумеване вредности за атрибуте?
  • Како можемо користити методе класе као конструкторе за креирање објеката?

Хајде да почнемо.

Питхон класе и објекти

Класе су фундаменталне за објектно оријентисано програмирање у Питхон-у. Можемо креирати класу и дефинисати атрибуте и методе—да бисмо повезали податке и повезане функције.

Када направимо класу, можемо је користити као нацрт (или шаблон) за креирање објеката (инстанци).

👩‍🏫 Пример времена! Хајде да направимо класу Емплоиее где сваки објекат ове класе има следеће атрибуте:

  • пуно_име: пуно име запосленог у формату име презиме
  • емп_ид: ИД запосленог
  • одељење: одељење коме припадају
  • искуство: број година искуства које имају

Шта ово значи? 🤔

Сваки појединачни запослени ће бити инстанца или објекат класе Емплоиее. И сваки објекат ће имати своју вредност за пуно_име, емп_ид, одељење и искуство.

Ови атрибути се такође називају променљиве инстанце, а термине атрибути и променљиве инстанце користићемо наизменично.

Доћи ћемо до додавања атрибута за мало. За сада креирамо класу Емплоиее овако:

class Employee:
    pass

Коришћење пасс (као чувара места) помаже нам да избегнемо грешке када покренемо скрипту.

Иако тренутна верзија класе Емплоиее није од велике помоћи, она је и даље важећа класа. Тако можемо да креирамо објекте класе Емплоиее:

employee_1 = Employee()

print(employee_1)
#Output: <__main__.Employee object at 0x00FEE7F0>

Такође можемо додати атрибуте и иницијализовати их вредностима као што је приказано:

employee_1.full_name="Amy Bell"
employee_1.department="HR"

Али овај приступ додавању атрибута инстанце је и неефикасан и подложан грешкама. Такође, ово не дозвољава коришћење класе као шаблона за креирање објеката. Ево где метода __инит__ помаже.

Разумевање улоге __инит__ методе у Питхон класи

Требало би да будемо у могућности да иницијализујемо променљиве инстанце приликом инстанцирања објекта, а метода __инит__ нам помаже у томе. Метода __инит__ се позива сваки пут када се креира нови објекат класе за иницијализацију вредности променљивих инстанце.

  Како да направите мастер слајдова у Мицрософт ПоверПоинт-у

Ако сте програмирали на језику као што је Ц++, видећете да метода __инит__ функционише слично као и конструктори.

Дефинисање методе __инит__

Хајде да додамо метод __инит__ у класу Емплоиее:

class Employee:
    def __init__(self, full_name,emp_id,department,experience):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience

Параметар селф се односи на инстанцу класе, а селф.аттрибуте иницијализује атрибут инстанце на вредност са десне стране.

Сада можемо креирати такве објекте:

employee_2 = Employee('Bella Joy','M007','Marketing',3)
print(employee_2)
# Output: <__main__.Employee object at 0x017F88B0>

Када одштампамо објекте запослених, не добијамо никакве корисне информације осим о класи којој припадају. Хајде да додамо методу __репр__ која дефинише низ за представљање за класу:

 def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

Додавањем __репр__ у класу Емплоиее, имамо:

class Employee:
    def __init__(self, full_name,emp_id,department,experience):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience
    
     def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

Сада објекти запослених имају користан низ за представљање:

print(employee_2)
# Output: Bella Joy,M007 from Marketing with 3 years of experience.

Неке конвенције

Пре него што наставимо даље, ево неколико напомена:

  • Користили смо селф као први параметар у методи __инит__ за упућивање на саму инстанцу класе и користили селф.аттрибуте_наме за иницијализацију различитих атрибута. Коришћење селфа је преферирана конвенција (ипак можете користити било које друго име).
  • Када дефинишемо метод __инит__, постављамо имена параметара у __инит__ дефиницијама да одговарају именима атрибута. Ово побољшава читљивост.

Како додати подразумеване вредности за атрибуте

У примеру који смо до сада кодирали, сви атрибути су обавезни. То значи да је креирање објекта успешно само ако конструктору проследимо вредности за сва поља.

Покушајте да инстанцирате објекат класе Емплоиее без прослеђивања вредности за атрибут искуства:

employee_3 = Employee('Jake Lee','E001','Engineering')

Добићете следећу грешку:

Traceback (most recent call last):
  File "main.py", line 22, in <module>
    employee_3 = Employee('Jake Lee','E001','Engineering')
TypeError: __init__() missing 1 required positional argument: 'experience'

Али ако желите да одређене атрибуте учините опционим, то можете учинити тако што ћете обезбедити подразумеване вредности за те атрибуте када дефинишете метод __инит__.

Овде дајемо подразумевану вредност 0 за атрибут искуства:

class Employee:
    def __init__(self, full_name,emp_id,department,experience=0):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience
    
     def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

Објекат емплоиее_3 је креиран без вредности за атрибут искуства; подразумевана вредност 0 се користи за искуство.

employee_3 = Employee('Jake Lee','E001','Engineering')
print(employee_3.experience)
# Output: 0

Алтернативни конструктори класа који користе методе класа

До сада смо видели само како да дефинишемо метод __инит__ и поставимо подразумеване вредности за атрибуте када је то потребно. Такође знамо да треба да проследимо вредности за тражене атрибуте у конструктору.

  Како приступити НАСА-ином новом сервису за стримовање и истражити свемир

Понекад, међутим, вредности за ове променљиве инстанце (или атрибуте) могу бити доступне у другој структури података, као што је тупле, речник или ЈСОН стринг.

Па шта да радимо?

Узмимо пример. Претпоставимо да имамо вредности променљиве инстанце у Питхон речнику:

dict_fanny = {'name':'Fanny Walker','id':'H203','dept':'HR','exp':2}

Можемо да додирнемо речник и добијемо све атрибуте овако:

name = dict_fanny['name']
id = dict_fanny['id']
dept = dict_fanny['dept']
exp = dict_fanny['exp']

Након тога можете креирати објекат тако што ћете проследити ове вредности у конструктор класе:

employee_4 = Employee(name, id, dept, exp)
print(employee_4)
# Output: Fanny Walker,H203 from HR with 2 years of experience.

Запамтите: ово морате да урадите за сваки нови објекат који креирате. Овај приступ је неефикасан и дефинитивно можемо боље. Али како?

У Питхон-у можемо користити методе класе као конструкторе за креирање објеката класе. За креирање методе класе користимо декоратор @цлассметход.

Хајде да дефинишемо метод који анализира речник, добија вредности променљиве инстанце и користи их за конструисање Емплоиее објеката.

    @classmethod
    def from_dict(cls,data_dict):
        full_name = data_dict['name']
        emp_id = data_dict['id']
        department = data_dict['dept']
        experience = data_dict['exp']
        return cls(full_name, emp_id, department, experience)

Када треба да креирамо објекте користећи податке из речника, можемо користити метод класе фром_дицт().

💡 Обратите пажњу на употребу цлс у методи класе уместо селф. Баш на начин на који користимо селф за упућивање на инстанцу, цлс се користи за упућивање на класу. Такође, методе класе су везане за класу, а не за објекте.

Дакле, када позовемо метод класе фром_дицт() за креирање објеката, позивамо га у класи Емплоиее:

emp_dict = {'name':'Tia Bell','id':'S270','dept':'Sales','exp':3}
employee_5 = Employee.from_dict(emp_dict)
print(employee_5)
# Output: Tia Bell,S270 from Sales with 3 years of experience.

Сада, ако имамо речник за сваког од н запослених, можемо користити метод класе фром_дицт() као конструктор за инстанцирање објеката – без потребе да преузимамо вредности тренутне променљиве из речника.

📝Напомена о класним варијаблама

Овде смо дефинисали метод класе који је везан за класу, а не за појединачне инстанце. Слично методама класе, можемо имати и променљиве класе.

  Како пронаћи некога на ЛинкедИн-у по адреси е-поште

Као и методе класе, променљиве класе су везане за класу, а не за инстанцу. Када атрибут има фиксну вредност за све инстанце класе, можемо размотрити да их дефинишемо као променљиве класе.

ФАКс

1. Зашто вам је потребан метод __инит__ у Питхон-у?

Метода __инит__ у дефиницији класе омогућава нам да иницијализујемо атрибуте или променљиве инстанце свих инстанци класе. Метода __инит__ се позива сваки пут када се креира нова инстанца класе.

2. Можете ли да имате више __инит__ метода у Питхон класи?

Циљ постојања више __инит__ метода у Питхон класи је да се обезбеди више конструктора који инстанцирају објекте. Али не можете дефинисати више __инит__ метода. Ако дефинишете више метода __инит__, друга и најновија имплементација ће заменити прву. Међутим, можете користити декоратор @цлассметход да дефинишете методе класе које се могу користити као конструктори за инстанцирање објеката.

3. Шта се дешава ако не дефинишете метод __инит__ у класи?

Ако не дефинишете метод __инит__, и даље можете инстанцирати објекте. Међутим, мораћете ручно да додате променљиве инстанце и доделите вредности свакој од њих. Нећете моћи да проследите вредности за променљиве инстанце у конструктору. Ово не само да је склоно грешкама, већ и поништава сврху постојања класе као нацрта из којег можемо инстанцирати објекте.

4. Можете ли да имате подразумеване вредности за аргументе у методи __инит__?

Да, могуће је обезбедити подразумеване вредности за један или више атрибута приликом дефинисања методе __инит__. Пружање подразумеваних вредности помаже да ти атрибути буду опциони у конструктору. Атрибути узимају подразумеване вредности када не проследимо вредности за ове атрибуте у конструктору.

5. Можете ли да измените атрибуте ван методе __инит__?

Да, увек можете ажурирати вредност атрибута ван методе __инит__. Такође можете динамички додати нове атрибуте инстанци након што сте креирали одређену инстанцу.

Закључак

У овом водичу смо научили како да користимо метод __инит__ за иницијализацију вредности променљивих инстанце. Иако је ово једноставно, може се понављати – посебно када имате много атрибута.

Ако сте заинтересовани, можете истражити модул класа података. У Питхон-у 3.7 и новијим верзијама можете користити уграђени модул класа података за креирање класа података које чувају податке. Поред подразумеваних имплементација __инит__ и других често коришћених метода; долазе са много сјајних функција за наговештаје типа, сложене подразумеване вредности и оптимизацију.

Затим сазнајте више о томе да ли је __наме__==’__маин__’ у Питхон-у.