Зеҳн
Курси фишурдаи Python

Омӯзиши барномасозӣ бо Python аз сифр: насби Python ва муҳаррири код, тағйирёбандаҳо ва сатрҳо, рӯйхатҳо, дастурҳои if, луғатҳо, воридкунии маълумот ва даврҳои while, функсияҳо, классҳо, кор бо файлҳо ва истисноҳо ва санҷиши код бо pytest. Ҳар боб мисолҳои код ва машқҳои «Худатон бисанҷед» дорад. Муқаддима ва бобҳои 2–11 тарҷумаи тоҷикии китоби Эрик Маттес «Python Crash Course» (нашри 3) мебошанд; боби 1 ва замима барои ин нашр навишта шудаанд.

Агенти Зеҳнӣ · 16 октябри 2026 · 13 саҳифа · 2 писанд

БарномасозӣТаҳсилот
Аз аввал хондан

Боби 9. Классҳо

Барномасозии ба объект нигаронидашуда — Object-Oriented Programming ё OOP — яке аз равишҳои самараноки навиштани нармафзор аст. Дар ин равиш шумо классҳое менависед, ки ашё ва ҳолатҳои ҷаҳони воқеиро ифода мекунанд ва дар асоси онҳо объектҳо месозед. Ҳангоми навиштани класс рафтори умумиеро муайян мекунед, ки тамоми як гурӯҳи объектҳо дошта метавонанд.

Вақте аз класс объектҳои алоҳида месозед, ҳар объект ба таври худкор ин рафтори умумиро мегирад. Баъдан метавонед ба ҳар объект хусусиятҳои хоси дилхоҳатонро диҳед. Шумо хоҳед дид, ки бо барномасозии ба объект нигаронидашуда ҳолатҳои воқеиро то чӣ андоза хуб моделсозӣ кардан мумкин аст.

Сохтани объект аз рӯйи класс намунасозӣ ё instantiation ном дорад. Объекти сохташударо намунаи класс — instance — мегӯянд.

Дар ин боб шумо классҳо менависед ва аз онҳо намунаҳо месозед. Муайян мекунед, ки дар намунаҳо чӣ гуна маълумот нигоҳ дошта мешавад ва бо онҳо кадом амалҳоро иҷро кардан мумкин аст.

Ҳамчунин классҳое менависед, ки имкониятҳои классҳои мавҷударо васеъ мекунанд. Ҳамин тавр, классҳои монанд метавонанд имкониятҳои умумиро якҷо истифода баранд ва шумо бо коди камтар кори бештар анҷом медиҳед.

Классҳоро дар модулҳо нигоҳ медоред ва классҳои навиштаи дигар барномасозонро ба файлҳои барномаатон ворид мекунед.

Омӯхтани барномасозии ба объект нигаронидашуда ёрӣ медиҳад, ки ба ҷаҳон аз нигоҳи барномасоз нигаред. Шумо на танҳо мефаҳмед, ки код сатр ба сатр чӣ кор мекунад, балки мафҳумҳои умумии паси онро низ дарк менамоед.

Фаҳмидани мантиқи классҳо тафаккури мантиқии шуморо инкишоф медиҳад, то барои ҳалли қариб ҳар мушкили пешомада барномаи самаранок навишта тавонед.

Классҳо ҳамчунин ҳангоми кор бо масъалаҳои мураккабтар кори шумо ва ҳамкоронатонро осон мекунанд. Агар шумо ва дигар барномасозон кодро бо мантиқи ҳамсон нависед, фаҳмидани кори якдигар осонтар мешавад.

Барномаҳои шумо барои ҳамкорон фаҳмо мешаванд ва ин ба ҳама имкон медиҳад, ки кори бештар анҷом диҳанд.

Сохтан ва истифода бурдани класс

Бо классҳо қариб ҳама чизро моделсозӣ кардан мумкин аст.

Аз класси содаи Dog оғоз мекунем, ки сагро ифода мекунад. Ин класс барои як саги муайян нест; он метавонад сагҳои гуногунро ифода кунад.

Мо дар бораи аксари сагҳои хонагӣ чӣ медонем? Ҳамаашон ном ва синну сол доранд. Ҳамчунин медонем, ки аксари сагҳо нишаста метавонанд ва ба паҳлу ғел мезананд.

Ин ду маълумот — ном ва синну сол — ва ин ду рафтор — нишастан ва ғел задан — ба класси Dog дохил мешаванд, зеро барои аксари сагҳо умумӣ мебошанд.

Ин класс ба Python мефаҳмонад, ки чӣ гуна объекти ифодакунандаи сагро созад. Пас аз навиштани класс аз он намунаҳои алоҳида месозем, ки ҳар кадом як саги мушаххасро ифода мекунад.

Сохтани класси Dog

Ҳар намунаи аз класси Dog сохташуда ном ва синну солро нигоҳ медорад. Ба ҳар саг ҳамчунин имкони иҷрои sit() ва roll_over()-ро медиҳем.

dog.py

class Dog:  
    """Кӯшиши содаи моделсозии саг."""

    def __init__(self, name, age):  
        """Ба атрибутҳои ном ва синну сол қимати ибтидоӣ медиҳад."""  
        self.name = name  
        self.age = age

    def sit(self):  
        """Нишастани сагро дар ҷавоб ба фармон тақлид мекунад."""  
        print(f"{self.name} ҳоло нишастааст.")

    def roll_over(self):  
        """Ғел задани сагро дар ҷавоб ба фармон тақлид мекунад."""  
        print(f"{self.name} ғел зад!")  

Дар ин код ҷузъиёти зиёд ҳаст, аммо хавотир нашавед. Дар тамоми боб ин сохторро такроран мебинед ва барои одат кардан ба он вақти кофӣ хоҳед дошт.

Аввал классро бо номи Dog муайян мекунем. Мувофиқи қоидаи маъмули Python, номи класс бо ҳарфи калон оғоз мешавад.

Дар ин таърифи класс қавс нест, зеро онро аз ибтидо месозем. Баъдан docstring менависем, ки вазифаи классро тавсиф мекунад.

Методи __init__()

Функсияе, ки қисми класс аст, метод ном дорад.

Ҳар он чизе, ки дар бораи функсияҳо омӯхтед, ба методҳо низ дахл дорад. Ҳоло фарқи асосӣ тарзи даъват кардани онҳост.

Методи __init__() методи махсусест, ки Python ҳангоми сохтани ҳар намунаи нави класси Dog ба таври худкор иҷро мекунад.

Дар аввал ва охири номи ин метод ду аломати зерхат мавҷуд аст. Ин қоида ёрӣ медиҳад, ки номҳои методҳои махсуси Python бо номҳои интихобкардаи шумо бархӯрд накунанд.

Ҳатман дар ҳар ду тарафи init ду зерхат нависед. Агар танҳо яктоӣ нависед, метод ҳангоми сохтани намуна ба таври худкор даъват намешавад ва ин метавонад хатоҳои душворфаҳм ба вуҷуд орад.

Мо __init__()-ро бо се параметр муайян кардем:

self, name, age  

Параметри self дар таърифи ин метод зарур аст ва бояд пеш аз параметрҳои дигар ҷойгир шавад.

Сабаб он аст, ки вақте Python ин методро барои омодасозии намунаи Dog даъват мекунад, аргументи self-ро ба таври худкор медиҳад.

Ҳангоми даъвати методи вобаста ба намуна, худи намуна ҳамчун аргументи аввал дода мешавад. self ишора ба ҳамин намуна аст ва ба он дастрасӣ ба атрибутҳо ва методҳои классро медиҳад.

Вақте намунаи Dog месозем, Python методи __init__()-ро иҷро мекунад. Мо ба Dog() танҳо ном ва синну сол медиҳем. self худкор дода мешавад ва навиштани он дар даъват лозим нест.

Аз ин рӯ, барои сохтани намунаи Dog танҳо қиматҳои ду параметри охирин — name ва age — пешниҳод мешаванд.

Ду тағйирёбандаи дар баданаи __init__() муайяншуда пешванди self доранд:

self.name = name  
self.age = age  

Атрибутҳои бо self муайяншуда тавассути намуна дастрасанд ва методҳои класс метавонанд бо онҳо кор кунанд.

Сатри self.name = name қимати параметри name-ро гирифта, ба атрибути name-и намунаи ҷорӣ нисбат медиҳад.

Барои self.age = age низ ҳамин раванд иҷро мешавад.

Чунин тағйирёбандаҳои вобаста ба намуна атрибутҳо ном доранд.

Дар класси Dog боз ду метод муайян шудааст: sit() ва roll_over().

Азбаски онҳо барои иҷро ба маълумоти иловагӣ ниёз надоранд, танҳо як параметр — self — доранд.

Намунаҳое, ки баъдтар месозем, метавонанд ин методҳоро истифода баранд. Ба ибораи дигар, сагҳои мо метавонанд нишинанд ва ғел зананд.

Ҳоло sit() ва roll_over() кори зиёд намекунанд. Онҳо танҳо паёме чоп мекунанд, ки саг нишастааст ё ғел задааст.

Аммо ин мафҳумро ба ҳолатҳои воқеӣ васеъ кардан мумкин аст. Агар класс қисми бозии компютерӣ мебуд, методҳо коди нишастан ва ғел задани саги аниматсиониро дар бар мегирифтанд.

Агар класс барои идора кардани робот навишта мешуд, методҳо ҳаракатҳоеро идора мекарданд, ки саги роботиро менишонанд ва мегардонанд.

Сохтани намуна аз класс

Классро ҳамчун маҷмӯи дастурҳои сохтани намуна тасаввур кунед.

Класси Dog ба Python мефаҳмонад, ки чӣ гуна намунаҳои алоҳидаи ифодакунандаи сагҳои мушаххасро созад.

Биёед як намуна созем:

class Dog:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

my_dog = Dog('Willie', 6)

print(f"Номи саги ман {my_dog.name} аст.")  
print(f"Саги ман {my_dog.age}-сола аст.")  

Эзоҳ: Дар ин боб, вақте класс аллакай пурра нишон дода шудааст, дар мисолҳои навбатӣ қисми тағйирнаёфтаи он бо шарҳ ва ... ихтисор мешавад. Ин танҳо барои кӯтоҳии китоб аст: дар файли худ тамоми классро нигоҳ доред ва танҳо қисмҳои навро илова кунед. Агар мисолро бо ... айнан нусхабардорӣ кунед, барнома бо хатои AttributeError ё TypeError қатъ мешавад, зеро методҳо вуҷуд надоранд. Шакли пурраи модулҳои car.py ва electric_car.py дар бахши «Ворид кардани классҳо» оварда шудааст.

Класси Dog дар ин ҷо ҳамон классест, ки дар мисоли пешина навиштем. Дар мисолҳои кӯтоҳшуда қисми такрории код нишон дода намешавад.

Мо ба Python мегӯем, ки сагеро бо номи 'Willie' ва синни 6 созад.

Ҳангоми хондани ин сатр Python методи __init__()-и Dog-ро бо аргументҳои 'Willie' ва 6 иҷро мекунад.

Ин метод атрибутҳои name ва age-и намунаи навро бо қиматҳои пешниҳодшуда омода месозад. Дар натиҷа, Python намунаи ифодакунандаи ин сагро бармегардонад.

Онро ба тағйирёбандаи my_dog нисбат медиҳем.

Қоидаи номгузорӣ дар ин ҷо муфид аст: одатан номи бо ҳарфи калон оғозшуда, монанди Dog, классро ифода мекунад. Номи бо ҳарфҳои хурд навишташуда, монанди my_dog, ба намунаи алоҳида ишора мекунад.

Дастрасӣ ба атрибутҳо

Барои дастрасӣ ба атрибутҳои намуна аз навишт бо нуқта истифода мебарем.

Масалан, барои гирифтани қимати атрибути name-и my_dog чунин менависем:

my_dog.name  

Ин тарзи навишт дар Python бисёр истифода мешавад.

Python аввал ба намунаи my_dog назар мекунад ва баъд атрибути name-и ба он вобастаро меёбад. Ин ҳамон атрибутест, ки дар дохили класс бо номи self.name истифода мешуд.

Барои кор бо age низ ҳамин роҳро истифода мебарем.

Натиҷа маълумоти маълуми моро дар бораи my_dog нишон медиҳад:

Номи саги ман Willie аст.  
Саги ман 6-сола аст.  

Даъват кардани методҳо

Пас аз сохтани намунаи Dog метавонем бо истифодаи нуқта ҳар методи муайяншудаи онро даъват кунем.

Биёед сагамонро шинонем ва ғел занонем:

class Dog:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

my_dog = Dog('Willie', 6)  
my_dog.sit()  
my_dog.roll_over()  

Барои даъват номи намуна ва номи методро менависем ва байни онҳо нуқта мегузорем.

Вақте Python my_dog.sit()-ро мехонад, методи sit()-ро дар класси Dog пайдо карда, кодашро иҷро мекунад.

Сатри my_dog.roll_over() низ ҳамин тавр коркард мешавад.

Акнун Willie фармонҳои моро иҷро мекунад:

Willie ҳоло нишастааст.  
Willie ғел зад!  

Ин тарзи навишт хеле муфид аст.

Агар атрибутҳо ва методҳо номҳои маънодор дошта бошанд, монанди name, age, sit() ва roll_over(), мақсади блоки кодро ҳатто ҳангоми бори аввал дидан ба осонӣ фаҳмида метавонем.

Сохтани якчанд намуна

Аз як класс ба қадри зарурат намуна сохтан мумкин аст.

Биёед саги дуюмеро бо номи тағйирёбандаи your_dog созем:

class Dog:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

my_dog = Dog('Willie', 6)  
your_dog = Dog('Lucy', 3)

print(f"Номи саги ман {my_dog.name} аст.")  
print(f"Саги ман {my_dog.age}-сола аст.")  
my_dog.sit()

print(f"\nНоми саги шумо {your_dog.name} аст.")  
print(f"Саги шумо {your_dog.age}-сола аст.")  
your_dog.sit()  

Дар ин мисол саге бо номи Willie ва саге бо номи Lucy месозем.

Ҳар саг намунаи ҷудогона аст ва атрибутҳои худро дорад. Аммо ҳар ду маҷмӯи якхелаи амалҳоро иҷро карда метавонанд:

Номи саги ман Willie аст.  
Саги ман 6-сола аст.  
Willie ҳоло нишастааст.

Номи саги шумо Lucy аст.  
Саги шумо 3-сола аст.  
Lucy ҳоло нишастааст.  

Ҳатто агар барои саги дуюм ҳамон ном ва синну солро истифода мебурдем, Python боз ҳам намунаи ҷудогона месохт.

Аз як класс ҳар қадар намуна лозим бошад, сохтан мумкин аст. Барои нигоҳ доштани ҳар кадом номи тағйирёбандаи ҷудогона ё ҷойи алоҳида дар рӯйхат ё луғат истифода баред.

Худатон бисанҷед

9-1. Тарабхона: Классе бо номи Restaurant созед.

Методи __init__() бояд ду атрибутро нигоҳ дорад:

  • restaurant_name — номи тарабхона;
  • cuisine_type — навъи таомҳо.

Методи describe_restaurant() нависед, ки ин ду маълумотро чоп кунад.

Методи open_restaurant() низ нависед, ки кушода будани тарабхонаро хабар диҳад.

Аз класс намунае бо номи restaurant созед. Ду атрибутро алоҳида чоп кунед ва баъд ҳар ду методро даъват намоед.

9-2. Се тарабхона: Аз класси машқи 9-1 оғоз кунед.

Се намунаи гуногун созед ва барои ҳар кадом describe_restaurant()-ро даъват намоед.

9-3. Корбарон: Классе бо номи User созед.

Атрибутҳои first_name ва last_name ва чанд атрибути дигари маъмули профили корбарро илова кунед.

Методи describe_user() нависед, ки маълумоти мухтасари корбарро чоп кунад.

Методи дигари greet_user() бояд ба корбар паёми шахсии салом чоп намояд.

Якчанд намунаи корбарони гуногунро созед ва ҳар ду методро барои ҳар корбар даъват кунед.

Кор бо классҳо ва намунаҳо

Классҳоро барои ифодаи ҳолатҳои зиёди воқеӣ истифода бурдан мумкин аст.

Пас аз навиштани класс қисми зиёди вақтро бо намунаҳои аз он сохташуда кор мекунед.

Яке аз вазифаҳои аввал тағйир додани атрибутҳои намунаи муайян мебошад.

Атрибутҳоро метавон мустақиман тағйир дод ё методҳое навишт, ки онҳоро бо тарзи муайян нав мекунанд.

Класси Car

Биёед класси нави ифодакунандаи мошинро нависем.

Ин класс маълумоти мошинро нигоҳ медорад ва методе дорад, ки маълумотро ба шакли мухтасар бармегардонад.

car.py

class Car:  
    """Кӯшиши содаи ифода кардани мошин."""

    def __init__(self, make, model, year):  
        """Атрибутҳои тавсифкунандаи мошинро омода мекунад."""  
        self.make = make  
        self.model = model  
        self.year = year

    def get_descriptive_name(self):  
        """Номи тавсифии мураттабшударо бармегардонад."""  
        long_name = f"{self.year} {self.make} {self.model}"  
        return long_name.title()

my_new_car = Car('audi', 'a4', 2024)  
print(my_new_car.get_descriptive_name())  

Дар класси Car, мисли Dog, параметри аввали методи __init__() — self аст.

Боз се параметр дорем:

  • make — тамға ё истеҳсолкунанда;
  • model — модел;
  • year — соли истеҳсол.

Методи __init__() ин қиматҳоро гирифта, ба атрибутҳои намуна нисбат медиҳад.

Барои сохтани ҳар намунаи нави Car бояд тамға, модел ва соли истеҳсолро муайян кунем.

Методи get_descriptive_name() сол, тамға ва модели мошинро дар як сатри матнӣ муттаҳид мекунад.

Ҳамин тавр, дигар зарурат нест, ки қимати ҳар атрибутро алоҳида чоп кунем.

Барои истифодаи атрибутҳо дар дохили метод self.make, self.model ва self.year менависем.

Берун аз класс намунае месозем ва онро ба my_new_car нисбат медиҳем. Баъд get_descriptive_name()-ро даъват мекунем:

2024 Audi A4  

Барои ҷолибтар кардани класс атрибуте илова мекунем, ки бо мурури вақт тағйир меёбад: масофаи умумии тайкардаи мошин.

Муайян кардани қимати пешфарз барои атрибут

Ҳангоми сохтани намуна баъзе атрибутҳоро бе гирифтани қимат ҳамчун параметр муайян кардан мумкин аст.

Онҳоро дар методи __init__() сохта, қимати пешфарз медиҳем.

Атрибуте бо номи odometer_reading илова мекунем, ки ҳамеша аз 0 оғоз мешавад.

Ҳамчунин методи read_odometer() менависем, то нишондиҳандаи масофасанҷи мошинро нишон диҳад:

class Car:

    def __init__(self, make, model, year):  
        """Атрибутҳои тавсифкунандаи мошинро омода мекунад."""  
        self.make = make  
        self.model = model  
        self.year = year  
        self.odometer_reading = 0

    def get_descriptive_name(self):  
        # Код мисли мисоли пешина аст.  
        long_name = f"{self.year} {self.make} {self.model}"  
        return long_name.title()

    def read_odometer(self):  
        """Масофаи тайкардаи мошинро чоп мекунад."""  
        print(f"Ин мошин {self.odometer_reading} мил роҳ тай кардааст.")

my_new_car = Car('audi', 'a4', 2024)  
print(my_new_car.get_descriptive_name())  
my_new_car.read_odometer()  

Ин дафъа ҳангоми иҷрои __init__() Python мисли пешина тамға, модел ва солро нигоҳ медорад.

Баъдан атрибути нави odometer_reading-ро сохта, қимати ибтидоии онро 0 мегузорад.

Методи нави read_odometer() хондани масофаи тайкардаи мошинро осон мекунад.

Мошини мо аз масофаи сифр оғоз мекунад:

2024 Audi A4  
Ин мошин 0 мил роҳ тай кардааст.  

Мошинҳои каме бо нишондиҳандаи дақиқи сифр фурӯхта мешаванд. Аз ин рӯ, ба роҳи тағйир додани ин атрибут ниёз дорем.

Тағйир додани қимати атрибутҳо

Қимати атрибутро бо се роҳ тағйир додан мумкин аст:

  • мустақиман тавассути намуна;
  • тавассути методе, ки қимати нав мегузорад;
  • тавассути методе, ки ба қимати ҷорӣ миқдори муайян илова мекунад.

Ҳар роҳро дида мебароем.

Тағйир додани мустақими қимати атрибут

Роҳи содатарин дастрасии мустақим ба атрибут тавассути намуна аст.

Дар ин ҷо нишондиҳандаи масофасанҷро бевосита ба 23 баробар мекунем:

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

my_new_car = Car('audi', 'a4', 2024)  
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23  
my_new_car.read_odometer()  

Бо истифодаи нуқта ба odometer_reading дастрасӣ пайдо карда, қиматашро мустақиман тағйир медиҳем.

Ин сатр ба Python мегӯяд, ки намунаи my_new_car-ро гирифта, атрибути odometer_reading-и онро ёбад ва қиматашро 23 гузорад:

2024 Audi A4  
Ин мошин 23 мил роҳ тай кардааст.  

Баъзан чунин дастрасии мустақим мувофиқ аст. Дар ҳолатҳои дигар беҳтар аст методе нависед, ки қиматро нав кунад.

Тағйир додани қимати атрибут тавассути метод

Доштани методҳое, ки атрибутҳои муайянро нав мекунанд, муфид аст.

Ба ҷойи дастрасии мустақим, қимати навро ба метод медиҳед ва он тағйиротро дар дохили худ иҷро мекунад.

Мисоли методи update_odometer():

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

    def update_odometer(self, mileage):  
        """Нишондиҳандаи масофасанҷро ба қимати додашуда мегузорад."""  
        self.odometer_reading = mileage

my_new_car = Car('audi', 'a4', 2024)  
print(my_new_car.get_descriptive_name())

my_new_car.update_odometer(23)  
my_new_car.read_odometer()  

Ягона илова ба Car методи update_odometer() аст.

Он қимати масофаро қабул карда, ба self.odometer_reading нисбат медиҳад.

Методро тавассути my_new_car бо аргументи 23 даъват мекунем. Нишондиҳанда ба 23 баробар мешавад ва read_odometer() онро чоп мекунад:

2024 Audi A4  
Ин мошин 23 мил роҳ тай кардааст.  

Методи update_odometer()-ро метавон васеъ кард, то ҳар дафъа ҳангоми нав кардани масофа корҳои иловагӣ иҷро кунад.

Биёед санҷише илова кунем, ки кам кардани нишондиҳандаро рад намояд:

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

    def update_odometer(self, mileage):  
        """  
        Нишондиҳандаи масофасанҷро ба қимати додашуда мегузорад.  
        Агар қимати нав аз қимати ҷорӣ камтар бошад, онро рад мекунад.  
        """  
        if mileage >= self.odometer_reading:  
            self.odometer_reading = mileage  
        else:  
            print("Нишондиҳандаи масофасанҷро кам кардан мумкин нест!")  

Акнун update_odometer() пеш аз тағйир додани атрибут мувофиқ будани қимати навро месанҷад.

Агар mileage аз self.odometer_reading калон ё ба он баробар бошад, қимати нав қабул мешавад.

Агар қимати нав аз масофаи ҷорӣ камтар бошад, паёми огоҳкунанда чоп мешавад.

Зиёд кардани қимати атрибут тавассути метод

Баъзан ба ҷойи гузоштани қимати тамоман нав мехоҳед ба қимати ҷорӣ миқдори муайян илова кунед.

Фарз мекунем, мошини истифодашуда харидем ва аз вақти харид то бақайдгирии он 100 мил роҳ тай кардем.

Методи зерин имкон медиҳад, ки ин миқдорро ба нишондиҳандаи масофасанҷ илова кунем:

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

    def increment_odometer(self, miles):  
        """Миқдори додашударо ба нишондиҳандаи масофасанҷ илова мекунад."""  
        self.odometer_reading += miles

my_used_car = Car('subaru', 'outback', 2019)  
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23_500)  
my_used_car.read_odometer()

my_used_car.increment_odometer(100)  
my_used_car.read_odometer()  

Методи нави increment_odometer() шумораи милҳоро қабул карда, ба self.odometer_reading илова мекунад.

Аввал намунаи мошини истифодашударо бо номи my_used_car месозем.

Бо даъвати update_odometer(23_500) нишондиҳандаро ба 23 500 мегузорем.

Сипас increment_odometer(100)-ро даъват мекунем, то 100 мили тайкардаамон илова шавад:

2019 Subaru Outback  
Ин мошин 23500 мил роҳ тай кардааст.  
Ин мошин 23600 мил роҳ тай кардааст.  

Методро метавон тағйир дод, то миқдори манфиро қабул накунад ва касе бо ин роҳ нишондиҳандаи масофасанҷро кам карда натавонад.

Эзоҳ: Чунин методҳо тарзи нав кардани қиматҳоро идора мекунанд. Аммо шахсе, ки ба барнома дастрасӣ дорад, метавонад атрибутро мустақиман тағйир диҳад. Амнияти муассир ғайр аз чунин санҷишҳои ибтидоӣ диққати бештар ба ҷузъиётро талаб мекунад.

Худатон бисанҷед

9-4. Шумораи муштариёни хизматрасонишуда: Аз барномаи машқи 9-1 оғоз кунед.

Атрибути number_served-ро бо қимати пешфарзи 0 илова намоед.

Намунаи restaurant созед. Шумораи муштариёни хизматрасонишударо чоп кунед, баъд қиматро тағйир дода, боз чоп намоед.

Методи set_number_served() илова кунед, ки имкон диҳад шумораи муштариёнро муайян намоед. Онро бо қимати нав даъват карда, натиҷаро чоп кунед.

Методи increment_number_served() низ илова кунед, ки шумораи муштариёнро зиёд кунад. Онро бо миқдоре даъват намоед, ки метавонад шумораи муштариёни як рӯзи кориро ифода кунад.

9-5. Кӯшишҳои воридшавӣ: Ба класси User аз машқи 9-3 атрибути login_attempts илова кунед.

Методи increment_login_attempts() нависед, ки ин қиматро як воҳид зиёд кунад.

Методи reset_login_attempts() низ нависед, ки онро ба 0 баргардонад.

Намунаи User созед ва increment_login_attempts()-ро чанд бор даъват кунед.

Қимати login_attempts-ро чоп карда, дуруст зиёд шуданашро санҷед. Баъд reset_login_attempts()-ро даъват намоед ва боз чоп кунед, то ба сифр баргаштанашро бинед.

Меросбарӣ

Ҳангоми навиштани класс на ҳамеша аз ибтидо оғоз кардан лозим аст.

Агар класси нав нусхаи махсусгардонидашудаи класси дигар бошад, метавонед аз меросбарӣ истифода баред.

Вақте як класс аз класси дигар мерос мегирад, атрибутҳо ва методҳои онро ба даст меорад.

Класси аслӣ класси волидайнӣ ё parent class ва класси нав класси фарзандӣ ё child class ном дорад.

Класси фарзандӣ метавонад атрибутҳо ва методҳои волидайнро истифода барад ва ҳамзамон атрибуту методҳои нави худро муайян кунад.

Методи __init__() барои класси фарзандӣ

Ҳангоми сохтани класс дар асоси класси мавҷуда аксар вақт мехоҳед методи __init__()-и волидайнро даъват кунед.

Ин атрибутҳои дар он муайяншударо омода карда, барои намунаи класси фарзандӣ дастрас месозад.

Ҳамчун мисол мошини барқиро моделсозӣ мекунем.

Мошини барқӣ навъи махсуси мошин аст. Аз ин рӯ, класси нави ElectricCar-ро дар асоси Car месозем.

Он гоҳ танҳо коди атрибутҳо ва рафторҳои хоси мошини барқиро навиштан лозим мешавад.

Аз нусхаи содаи ElectricCar оғоз мекунем, ки ҳамаи корҳои Car-ро иҷро мекунад.

electric_car.py

class Car:  
    """Кӯшиши содаи ифода кардани мошин."""

    def __init__(self, make, model, year):  
        """Атрибутҳои тавсифкунандаи мошинро омода мекунад."""  
        self.make = make  
        self.model = model  
        self.year = year  
        self.odometer_reading = 0

    def get_descriptive_name(self):  
        """Номи тавсифии мураттабшударо бармегардонад."""  
        long_name = f"{self.year} {self.make} {self.model}"  
        return long_name.title()

    def read_odometer(self):  
        """Масофаи тайкардаи мошинро чоп мекунад."""  
        print(f"Ин мошин {self.odometer_reading} мил роҳ тай кардааст.")

    def update_odometer(self, mileage):  
        """Нишондиҳандаи масофасанҷро нав мекунад."""  
        if mileage >= self.odometer_reading:  
            self.odometer_reading = mileage  
        else:  
            print("Нишондиҳандаи масофасанҷро кам кардан мумкин нест!")

    def increment_odometer(self, miles):  
        """Миқдори додашударо ба масофаи ҷорӣ илова мекунад."""  
        self.odometer_reading += miles


class ElectricCar(Car):  
    """Хусусиятҳои хоси мошинҳои барқиро ифода мекунад."""

    def __init__(self, make, model, year):  
        """Атрибутҳои класси волидайниро омода мекунад."""  
        super().__init__(make, model, year)


my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  

Аввал Car-ро муайян мекунем. Дар ин мисол, ки ҳар ду класс дар як файл ҳастанд, класси волидайн пеш аз класси фарзандӣ меояд.

Баъд ElectricCar-ро муайян мекунем. Дар қавсҳои таърифи класси фарзандӣ номи волидайн навишта мешавад:

class ElectricCar(Car):  

Методи __init__() маълумотеро қабул мекунад, ки барои сохтани намунаи Car лозим аст.

Функсияи махсуси super() имкон медиҳад, ки методи волидайнро даъват кунем.

Сатри зерин __init__()-и Car-ро иҷро мекунад ва атрибутҳои дар он муайяншударо барои намунаи ElectricCar омода месозад:

super().__init__(make, model, year)  

Номи super аз он бармеояд, ки класси волидайнро superclass ва класси фарзандиро subclass низ мегӯянд.

Барои санҷидани меросбарӣ мошини барқиро бо ҳамон навъи маълумоте месозем, ки барои мошини одӣ медодем.

Намунаи ElectricCar сохта, ба my_leaf нисбат медиҳем.

Ин даъват __init__()-и ElectricCar-ро иҷро мекунад, ки дар навбати худ __init__()-и волидайн — Car — ро даъват менамояд.

Аргументҳои мо 'nissan', 'leaf' ва 2024 мебошанд.

Ҳоло, ғайр аз __init__(), ҳеҷ атрибут ё методи махсуси мошини барқӣ надорем. Танҳо месанҷем, ки рафтори умумии Car дастрас аст:

2024 Nissan Leaf  

Намунаи ElectricCar мисли намунаи Car кор мекунад. Акнун метавонем хусусиятҳо ва методҳои хоси мошинҳои барқиро илова кунем.

Муайян кардани атрибутҳо ва методҳои класси фарзандӣ

Пас аз сохтани класси фарзандӣ метавонед ҳар атрибут ва методи нави заруриро илова кунед, то он аз волидайн фарқ намояд.

Масалан, атрибути хоси мошини барқӣ — зарфияти батарея — ва методи нишон додани онро илова мекунем:

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...


class ElectricCar(Car):  
    """Хусусиятҳои хоси мошинҳои барқиро ифода мекунад."""

    def __init__(self, make, model, year):  
        """  
        Атрибутҳои класси волидайниро омода мекунад.  
        Баъд атрибутҳои хоси мошини барқиро муайян мекунад.  
        """  
        super().__init__(make, model, year)  
        self.battery_size = 40

    def describe_battery(self):  
        """Зарфияти батареяро нишон медиҳад."""  
        print(f"Ин мошин батареяи {self.battery_size} кВт·соат дорад.")


my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  
my_leaf.describe_battery()  

Атрибути нави self.battery_size-ро илова карда, қимати ибтидоии онро 40 мегузорем.

Ин атрибут дар ҳамаи намунаҳои аз ElectricCar сохташуда мавҷуд мешавад, аммо ба намунаҳои одии Car худкор илова намегардад.

Методи describe_battery() маълумоти батареяро чоп мекунад.

Ҳангоми даъват тавсифе мегирем, ки равшан ба мошини барқӣ дахл дорад:

2024 Nissan Leaf  
Ин мошин батареяи 40 кВт·соат дорад.  

Барои махсусгардонии ElectricCar маҳдудияти муайяне вуҷуд надорад.

Метавонед ба қадри зарурат атрибутҳо ва методҳо илова кунед, то мошини барқиро бо дараҷаи дақиқии дилхоҳ моделсозӣ намоед.

Агар атрибут ё метод барои ҳамаи мошинҳо мувофиқ бошад, онро ба Car илова кунед.

Дар ин сурат ҳамаи истифодабарандагони Car низ ин имкониятро мегиранд ва ElectricCar танҳо коди хоси мошинҳои барқиро нигоҳ медорад.

Аз нав муайян кардани методҳои волидайн

Агар методи волидайн ба модели класси фарзандӣ мувофиқ набошад, метавонед онро аз нав муайян кунед — override.

Барои ин дар класси фарзандӣ методеро бо ҳамон ном менависед.

Ҳангоми даъват тавассути намунаи фарзандӣ Python методи навро истифода мебарад.

Фарз мекунем, Car методи fill_gas_tank() дорад.

Барои мошини комилан барқӣ пур кардани баки бензин маъно надорад. Аз ин рӯ, онро чунин аз нав муайян мекунем:

class ElectricCar(Car):  
    # Қисми боқимондаи код оварда нашудааст.  
    ...

    def fill_gas_tank(self):  
        """Мошинҳои барқӣ баки бензин надоранд."""  
        print("Ин мошин баки бензин надорад!")  

Акнун агар касе барои мошини барқӣ fill_gas_tank()-ро даъват кунад, Python ба ҷойи методи Car ин кодро иҷро мекунад.

Бо меросбарӣ метавонед имкониятҳои лозимии волидайнро нигоҳ доред ва рафторҳои номувофиқро аз нав муайян намоед.

Намунаҳо ҳамчун атрибут

Ҳангоми моделсозии ашёи воқеӣ шояд ба класс ҷузъиёти бештару бештар илова кунед.

Рӯйхати атрибутҳо ва методҳо калон мешавад ва файлҳо дароз мегарданд.

Дар чунин ҳолат мумкин аст дарк кунед, ки як қисми классро метавон ҳамчун класси ҷудогона навишт.

Класси калонро ба классҳои хурдтаре тақсим кардан мумкин аст, ки якҷо кор мекунанд. Ин равиш композитсия ном дорад.

Масалан, агар ба ElectricCar ҷузъиёти бештар илова кунем, мумкин аст атрибутҳо ва методҳои зиёди хоси батарея пайдо шаванд.

Онҳоро ба класси ҷудогонаи Battery мегузаронем. Сипас намунаи Battery-ро ҳамчун атрибути ElectricCar истифода мебарем:

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...


class Battery:  
    """Кӯшиши содаи моделсозии батареяи мошини барқӣ."""

    def __init__(self, battery_size=40):  
        """Атрибутҳои батареяро омода мекунад."""  
        self.battery_size = battery_size

    def describe_battery(self):  
        """Зарфияти батареяро нишон медиҳад."""  
        print(f"Ин мошин батареяи {self.battery_size} кВт·соат дорад.")


class ElectricCar(Car):  
    """Хусусиятҳои хоси мошинҳои барқиро ифода мекунад."""

    def __init__(self, make, model, year):  
        """  
        Атрибутҳои класси волидайниро омода мекунад.  
        Баъд атрибутҳои хоси мошини барқиро муайян мекунад.  
        """  
        super().__init__(make, model, year)  
        self.battery = Battery()


my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  
my_leaf.battery.describe_battery()  

Класси нави Battery аз классҳои дигари ин мисол мерос намегирад.

Методи __init__()-и он ғайр аз self як параметри дигар — battery_size — дорад.

Ин параметр ғайриҳатмӣ аст. Агар қимате дода нашавад, зарфияти батарея 40 мешавад.

Методи describe_battery() низ ба ин класс гузаронида шудааст.

Дар ElectricCar атрибути self.battery-ро илова мекунем:

self.battery = Battery()  

Ин сатр ба Python мегӯяд, ки намунаи нави Battery созад ва онро ба атрибути self.battery нисбат диҳад.

Азбаски қимати зарфиятро намедиҳем, қимати пешфарзи 40 истифода мешавад.

Ин кор ҳар дафъа ҳангоми иҷрои __init__() рӯй медиҳад. Пас, ҳар намунаи нави ElectricCar ба таври худкор батареяи худро мегирад.

Мошини барқиро сохта, ба my_leaf нисбат медиҳем.

Барои тавсифи батарея тавассути атрибути battery амал мекунем:

my_leaf.battery.describe_battery()  

Ин сатр ба Python мегӯяд:

  1. Намунаи my_leaf-ро ёб.
  2. Атрибути battery-и онро гир.
  3. Методи describe_battery()-и намунаи батареяро иҷро кун.

Натиҷа мисли пешина аст:

2024 Nissan Leaf  
Ин мошин батареяи 40 кВт·соат дорад.  

Шояд ин кори иловагӣ намояд. Аммо акнун батареяро ҳар қадар муфассал хоҳем, тавсиф карда метавонем, бе он ки ElectricCar аз ҳад пур шавад.

Ба Battery методи дигаре илова мекунем, ки масофаи ҳаракатро вобаста ба зарфияти батарея хабар диҳад:

class Car:  
    # Қисми боқимондаи код оварда нашудааст.  
    ...


class Battery:  
    # Методҳои қаблӣ дар ин ҷо ҷойгиранд.  
    ...

    def get_range(self):  
        """Масофаи ҳаракатро бо ин батарея нишон медиҳад."""  
        if self.battery_size == 40:  
            range = 150  
        elif self.battery_size == 65:  
            range = 225

        print(  
            f"Ин мошин бо як пуркунии пурра "  
            f"тақрибан {range} мил роҳ тай карда метавонад."  
        )


class ElectricCar(Car):  
    # Қисми боқимондаи код оварда нашудааст.  
    ...


my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  
my_leaf.battery.describe_battery()  
my_leaf.battery.get_range()  

Методи нави get_range() таҳлили сода анҷом медиҳад.

Агар зарфияти батарея 40 кВт·соат бошад, масофаи ҳаракатро 150 мил мегузорад. Агар 65 кВт·соат бошад, онро 225 мил муайян мекунад.

Баъд ин қиматро нишон медиҳад.

Барои истифодаи метод боз тавассути атрибути батареяи мошин муроҷиат мекунем.

Натиҷа масофаи ҳаракатро вобаста ба зарфияти батарея нишон медиҳад:

2024 Nissan Leaf  
Ин мошин батареяи 40 кВт·соат дорад.  
Ин мошин бо як пуркунии пурра тақрибан 150 мил роҳ тай карда метавонад.  

Моделсозии объектҳои воқеӣ

Ҳангоми моделсозии чизҳои мураккабтар, монанди мошини барқӣ, бо саволҳои ҷолиб рӯ ба рӯ мешавед.

Масалан, масофаи ҳаракати мошини барқӣ хусусияти батарея аст ё худи мошин?

Агар танҳо як мошинро тавсиф кунем, нигоҳ доштани get_range() дар Battery эҳтимол мувофиқ аст.

Аммо агар тамоми силсилаи мошинҳои як истеҳсолкунандаро тавсиф кунем, шояд беҳтар бошад get_range()-ро ба ElectricCar гузаронем.

Ин метод ҳанӯз пеш аз муайян кардани масофа зарфияти батареяро месанҷад, аммо натиҷа ба навъи муайяни мошин вобаста мешавад.

Роҳи дигар ин аст, ки get_range() дар Battery боқӣ монад, вале параметре монанди car_model қабул кунад.

Он гоҳ масофа аз рӯйи зарфияти батарея ва модели мошин муайян мешавад.

Ин марҳилаи ҷолиби рушди шумо ҳамчун барномасоз аст.

Ҳангоми андеша дар бораи чунин саволҳо шумо ба сатҳи баландтари мантиқӣ мегузаред. Диққат дигар танҳо ба тарзи навишти Python равона нест; шумо фикр мекунед, ки ҷаҳони воқеиро чӣ гуна дар код ифода намоед.

Дар ин марҳила мефаҳмед, ки барои моделсозии ҳолатҳои воқеӣ аксар вақт танҳо як роҳи дуруст вуҷуд надорад.

Баъзе роҳҳо аз дигарон самараноктаранд, аммо ёфтани сохтори беҳтарин таҷриба мехоҳад.

Агар код мувофиқи хоҳишатон кор кунад, шумо дар роҳи дуруст ҳастед.

Агар маҷбур шавед классҳоро чанд бор аз нав тартиб диҳед ва бо равишҳои гуногун нависед, рӯҳафтода нашавед.

Ҳама барои навиштани коди дақиқ ва самаранок аз чунин раванд мегузаранд.

Худатон бисанҷед

9-6. Дӯкони яхмос: Дӯкони яхмос навъи махсуси тарабхона аст.

Класси IceCreamStand нависед, ки аз Restaurant-и машқи 9-1 ё машқи 9-4 мерос гирад.

Ҳар ду нусха мувофиқанд; якеашро интихоб кунед.

Атрибути flavors илова намоед, ки рӯйхати навъҳои яхмосро нигоҳ дорад.

Методе нависед, ки ин навъҳоро нишон диҳад. Намунаи IceCreamStand созед ва методро даъват кунед.

9-7. Мудир: Мудир навъи махсуси корбар аст.

Класси Admin нависед, ки аз User-и машқи 9-3 ё машқи 9-5 мерос гирад.

Атрибути privileges илова кунед, ки рӯйхати чунин сатрҳоро нигоҳ дорад:

"метавонад навишта илова кунад"  
"метавонад навиштаро нест кунад"  
"метавонад корбарро масдуд кунад"  

Методи show_privileges() нависед, ки ҳуқуқҳои мудирро нишон диҳад.

Намунаи Admin созед ва методро даъват намоед.

9-8. Ҳуқуқҳо: Класси ҷудогонаи Privileges нависед.

Он бояд як атрибут — privileges — дошта бошад, ки рӯйхати сатрҳои машқи 9-7-ро нигоҳ дорад.

Методи show_privileges()-ро ба ин класс гузаронед.

Намунаи Privileges-ро ҳамчун атрибути Admin истифода баред.

Намунаи нави Admin созед ва ҳуқуқҳояшро бо метод нишон диҳед.

9-9. Беҳтар кардани батарея: Аз нусхаи охирини electric_car.py дар ин бахш истифода баред.

Ба Battery методи upgrade_battery() илова кунед.

Он бояд зарфияти батареяро санҷад ва агар 65 набошад, онро ба 65 гузорад.

Мошини барқиро бо батареяи пешфарз созед ва get_range()-ро даъват кунед.

Баъд батареяро беҳтар карда, get_range()-ро дубора даъват намоед.

Бояд зиёд шудани масофаи ҳаракатро бинед.

Ворид кардани классҳо

Бо зиёд шудани имкониятҳои классҳо файлҳо метавонанд дароз шаванд, ҳатто агар меросбарӣ ва композитсияро дуруст истифода баред.

Мувофиқи фалсафаи умумии Python, беҳтар аст файлҳо то ҳадди имкон мураттаб бошанд.

Python имкон медиҳад классҳоро дар модулҳо нигоҳ доред ва танҳо классҳои заруриро ба барномаи асосӣ ворид кунед.

Ворид кардани як класс

Модуле месозем, ки танҳо Car-ро дар бар мегирад.

Дар ин ҷо масъалаи номгузорӣ пайдо мешавад: мо аллакай дар ин боб файли car.py доштем. Аммо модули нав низ бояд car.py ном дошта бошад, зеро коди ифодакунандаи мошинро нигоҳ медорад.

Ин масъаларо бо иваз кардани файли пешинаи car.py ба модули дорои Car ҳал мекунем.

Аз ин пас барномаҳое, ки ин модулро истифода мебаранд, номҳои мушаххастар мегиранд, масалан my_car.py.

Файли нави car.py чунин аст.

car.py

"""Класс барои ифода кардани мошин."""

class Car:  
    """Кӯшиши содаи ифода кардани мошин."""

    def __init__(self, make, model, year):  
        """Атрибутҳои тавсифкунандаи мошинро омода мекунад."""  
        self.make = make  
        self.model = model  
        self.year = year  
        self.odometer_reading = 0

    def get_descriptive_name(self):  
        """Номи тавсифии мураттабшударо бармегардонад."""  
        long_name = f"{self.year} {self.make} {self.model}"  
        return long_name.title()

    def read_odometer(self):  
        """Масофаи тайкардаи мошинро чоп мекунад."""  
        print(f"Ин мошин {self.odometer_reading} мил роҳ тай кардааст.")

    def update_odometer(self, mileage):  
        """  
        Нишондиҳандаи масофасанҷро ба қимати додашуда мегузорад.  
        Кам кардани нишондиҳандаро рад мекунад.  
        """  
        if mileage >= self.odometer_reading:  
            self.odometer_reading = mileage  
        else:  
            print("Нишондиҳандаи масофасанҷро кам кардан мумкин нест!")

    def increment_odometer(self, miles):  
        """Миқдори додашударо ба масофаи ҷорӣ илова мекунад."""  
        self.odometer_reading += miles  

Дар аввали файл docstring-и сатҳи модул навиштем, ки мундариҷаи онро мухтасар тавсиф мекунад.

Барои ҳар модули сохтаатон чунин тавсиф нависед.

Акнун файли ҷудогонаи my_car.py месозем. Он Car-ро ворид карда, аз он намуна месозад.

my_car.py

from car import Car

my_new_car = Car('audi', 'a4', 2024)  
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23  
my_new_car.read_odometer()  

Дастури воридкунӣ ба Python мегӯяд, ки Car-ро аз модули car дастрас кунад.

Акнун метавонем Car-ро тавре истифода барем, ки гӯё дар ҳамин файл муайян шуда бошад.

Натиҷа мисли пешина аст:

2024 Audi A4  
Ин мошин 23 мил роҳ тай кардааст.  

Ворид кардани классҳо роҳи самараноки барномасозист.

Тасаввур кунед, агар тамоми Car дар файли асосӣ мебуд, он чӣ қадар дароз мешуд.

Бо гузаронидани класс ба модул ҳамон имкониятҳоро нигоҳ медоред, аммо файли асосӣ тоза ва хонданбоб мемонад.

Қисми зиёди мантиқ дар файлҳои ҷудогона ҷойгир мешавад. Пас аз дуруст кор кардани классҳо метавонед диққатро ба мантиқи умумии барномаи асосӣ равона кунед.

Нигоҳ доштани якчанд класс дар модул

Дар як модул ба қадри зарурат класс нигоҳ доштан мумкин аст, аммо онҳо бояд бо ҳам робитаи маъноӣ дошта бошанд.

Battery ва ElectricCar ҳар ду ба ифодаи мошинҳо ёрӣ медиҳанд. Аз ин рӯ, онҳоро ба car.py илова мекунем.

car.py

"""Маҷмӯи классҳо барои ифодаи мошинҳои бензинӣ ва барқӣ."""

class Car:  
    """Кӯшиши содаи ифода кардани мошин."""

    def __init__(self, make, model, year):  
        """Атрибутҳои тавсифкунандаи мошинро омода мекунад."""  
        self.make = make  
        self.model = model  
        self.year = year  
        self.odometer_reading = 0

    def get_descriptive_name(self):  
        """Номи тавсифии мураттабшударо бармегардонад."""  
        long_name = f"{self.year} {self.make} {self.model}"  
        return long_name.title()

    def read_odometer(self):  
        """Масофаи тайкардаи мошинро чоп мекунад."""  
        print(f"Ин мошин {self.odometer_reading} мил роҳ тай кардааст.")

    def update_odometer(self, mileage):  
        """  
        Нишондиҳандаи масофасанҷро ба қимати додашуда мегузорад.  
        Кам кардани нишондиҳандаро рад мекунад.  
        """  
        if mileage >= self.odometer_reading:  
            self.odometer_reading = mileage  
        else:  
            print("Нишондиҳандаи масофасанҷро кам кардан мумкин нест!")

    def increment_odometer(self, miles):  
        """Миқдори додашударо ба масофаи ҷорӣ илова мекунад."""  
        self.odometer_reading += miles


class Battery:  
    """Кӯшиши содаи моделсозии батареяи мошини барқӣ."""

    def __init__(self, battery_size=40):  
        """Атрибутҳои батареяро омода мекунад."""  
        self.battery_size = battery_size

    def describe_battery(self):  
        """Зарфияти батареяро нишон медиҳад."""  
        print(f"Ин мошин батареяи {self.battery_size} кВт·соат дорад.")

    def get_range(self):  
        """Масофаи ҳаракатро бо ин батарея нишон медиҳад."""  
        if self.battery_size == 40:  
            range = 150  
        elif self.battery_size == 65:  
            range = 225

        print(  
            f"Ин мошин бо як пуркунии пурра "  
            f"тақрибан {range} мил роҳ тай карда метавонад."  
        )


class ElectricCar(Car):  
    """Хусусиятҳои хоси мошинҳои барқиро моделсозӣ мекунад."""

    def __init__(self, make, model, year):  
        """  
        Атрибутҳои класси волидайниро омода мекунад.  
        Баъд атрибутҳои хоси мошини барқиро муайян мекунад.  
        """  
        super().__init__(make, model, year)  
        self.battery = Battery()  

Акнун файли нави my_electric_car.py месозем, ElectricCar-ро ворид мекунем ва мошини барқӣ месозем.

my_electric_car.py

from car import ElectricCar

my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  
my_leaf.battery.describe_battery()  
my_leaf.battery.get_range()  

Гарчанде қисми зиёди мантиқ дар модул ҷойгир шудааст, натиҷа ҳамон аст:

2024 Nissan Leaf  
Ин мошин батареяи 40 кВт·соат дорад.  
Ин мошин бо як пуркунии пурра тақрибан 150 мил роҳ тай карда метавонад.  

Ворид кардани якчанд класс аз модул

Ба файли барнома ҳар қадар класс лозим бошад, ворид кардан мумкин аст.

Агар хоҳем дар як файл мошини одӣ ва мошини барқӣ созем, ҳар ду класс — Car ва ElectricCar — ро ворид мекунем.

my_cars.py

from car import Car, ElectricCar

my_mustang = Car('ford', 'mustang', 2024)  
print(my_mustang.get_descriptive_name())

my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  

Барои ворид кардани чанд класс номҳои онҳоро бо вергул ҷудо мекунем.

Пас аз воридкунӣ аз ҳар кадом ба қадри зарурат намуна сохтан мумкин аст.

Дар ин мисол аввал Ford Mustang-и бензинӣ ва баъд Nissan Leaf-и барқӣ месозем:

2024 Ford Mustang  
2024 Nissan Leaf  

Ворид кардани тамоми модул

Метавонед тамоми модулро ворид карда, баъд бо истифодаи нуқта ба классҳои зарурӣ дастрасӣ пайдо кунед.

Ин усул сода аст ва кодро фаҳмо нигоҳ медорад.

Азбаски ҳар даъвати сохтани намуна номи модулро дар бар мегирад, номҳои классҳо мустақиман бо номҳои файли ҷорӣ бархӯрд намекунанд.

Мисоли ворид кардани тамоми car:

my_cars.py

import car

my_mustang = car.Car('ford', 'mustang', 2024)  
print(my_mustang.get_descriptive_name())

my_leaf = car.ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  

Аввал модули car-ро ворид мекунем.

Баъд ба классҳо бо шакли зерин дастрасӣ пайдо мекунем:

module_name.ClassName  

Боз Ford Mustang ва Nissan Leaf месозем.

Ворид кардани ҳамаи классҳои модул

Барои ворид кардани ҳамаи классҳои дастрас чунин навиштан мумкин аст:

from module_name import *  

Ин усул бо ду сабаб тавсия намешавад.

Аввал, аз хондани дастурҳои воридкунӣ дар аввали файл бояд равшан бошад, ки барнома кадом классҳоро истифода мебарад. Бо * ин маълум нест.

Дуюм, номҳо метавонанд бархӯрд кунанд.

Агар тасодуфан классе ворид кунед, ки номаш бо номи дигаре дар барнома яксон аст, хатоҳои душворёб ба вуҷуд омада метавонанд.

Ин усул дар ин ҷо нишон дода шудааст, зеро эҳтимол онро дар коди дигарон мебинед.

Агар аз як модул классҳои зиёд лозим бошанд, беҳтар аст тамоми модулро ворид карда, аз module_name.ClassName истифода баред.

Дар ин ҳолат ҳамаи номҳои классҳо дар аввали файл навишта намешаванд, аммо дар дохили барнома равшан дида мешавад, ки модул дар куҷо истифода шудааст.

Ҳамчунин аз бархӯрди эҳтимолии номҳо пешгирӣ мекунед.

Ворид кардани як модул ба модули дигар

Баъзан мехоҳед классҳоро байни чанд модул тақсим кунед, то як файл аз ҳад калон нашавад ва классҳои ба ҳам номуносиб дар як ҷо нигоҳ дошта нашаванд.

Дар ин ҳолат мумкин аст класси як модул ба класси модули дигар вобаста бошад.

Он гоҳ класси заруриро ба модули вобаста ворид мекунед.

Масалан, Car-ро дар як модул ва ElectricCar ва Battery-ро дар модули дигар нигоҳ медорем.

Модули нави electric_car.py месозем, ки файли пешинаи ҳамномро иваз мекунад. Танҳо Battery ва ElectricCar-ро ба он мегузаронем.

electric_car.py

"""Маҷмӯи классҳо барои ифодаи мошинҳои барқӣ."""

from car import Car


class Battery:  
    """Кӯшиши содаи моделсозии батареяи мошини барқӣ."""

    def __init__(self, battery_size=40):  
        """Атрибутҳои батареяро омода мекунад."""  
        self.battery_size = battery_size

    def describe_battery(self):  
        """Зарфияти батареяро нишон медиҳад."""  
        print(f"Ин мошин батареяи {self.battery_size} кВт·соат дорад.")

    def get_range(self):  
        """Масофаи ҳаракатро бо ин батарея нишон медиҳад."""  
        if self.battery_size == 40:  
            range = 150  
        elif self.battery_size == 65:  
            range = 225

        print(  
            f"Ин мошин бо як пуркунии пурра "  
            f"тақрибан {range} мил роҳ тай карда метавонад."  
        )


class ElectricCar(Car):  
    """Хусусиятҳои хоси мошинҳои барқиро моделсозӣ мекунад."""

    def __init__(self, make, model, year):  
        """  
        Атрибутҳои класси волидайниро омода мекунад.  
        Баъд атрибутҳои хоси мошини барқиро муайян мекунад.  
        """  
        super().__init__(make, model, year)  
        self.battery = Battery()  

Класси ElectricCar ба волидайни худ — Car — ниёз дорад. Аз ин рӯ, Car-ро мустақиман ба модул ворид мекунем.

Агар ин сатрро фаромӯш кунем, ҳангоми ворид кардани electric_car Python хато медиҳад.

Модули car-ро низ нав мекунем, то танҳо Car-ро нигоҳ дорад.

car.py

"""Класс барои ифода кардани мошин."""

class Car:  
    """Кӯшиши содаи ифода кардани мошин."""

    def __init__(self, make, model, year):  
        """Атрибутҳои тавсифкунандаи мошинро омода мекунад."""  
        self.make = make  
        self.model = model  
        self.year = year  
        self.odometer_reading = 0

    def get_descriptive_name(self):  
        """Номи тавсифии мураттабшударо бармегардонад."""  
        long_name = f"{self.year} {self.make} {self.model}"  
        return long_name.title()

    def read_odometer(self):  
        """Масофаи тайкардаи мошинро чоп мекунад."""  
        print(f"Ин мошин {self.odometer_reading} мил роҳ тай кардааст.")

    def update_odometer(self, mileage):  
        """  
        Нишондиҳандаи масофасанҷро ба қимати додашуда мегузорад.  
        Кам кардани нишондиҳандаро рад мекунад.  
        """  
        if mileage >= self.odometer_reading:  
            self.odometer_reading = mileage  
        else:  
            print("Нишондиҳандаи масофасанҷро кам кардан мумкин нест!")

    def increment_odometer(self, miles):  
        """Миқдори додашударо ба масофаи ҷорӣ илова мекунад."""  
        self.odometer_reading += miles  

Акнун классҳоро аз ҳар модул алоҳида ворид карда, мошини дилхоҳро месозем.

my_cars.py

from car import Car  
from electric_car import ElectricCar

my_mustang = Car('ford', 'mustang', 2024)  
print(my_mustang.get_descriptive_name())

my_leaf = ElectricCar('nissan', 'leaf', 2024)  
print(my_leaf.get_descriptive_name())  

Car ва ElectricCar-ро аз модулҳои худ ворид мекунем.

Баъд як мошини одӣ ва як мошини барқӣ месозем. Ҳар ду дуруст сохта мешаванд:

2024 Ford Mustang  
2024 Nissan Leaf  

Истифодаи номҳои ҷойгузин

Чунон ки дар боби 8 дидед, номҳои ҷойгузин ҳангоми истифодаи модулҳо барои ташкили лоиҳа муфиданд.

Онҳоро ҳангоми ворид кардани классҳо низ истифода бурдан мумкин аст.

Масалан, барномае доред, ки мошинҳои барқии зиёд месозад. Такроран навиштан ва хондани ElectricCar метавонад дилгиркунанда шавад.

Дар дастури воридкунӣ ба он номи ҷойгузин медиҳем:

from electric_car import ElectricCar as EC  

Акнун барои сохтани мошини барқӣ аз EC истифода мебарем:

my_leaf = EC('nissan', 'leaf', 2024)  

Ба худи модул низ номи ҷойгузин додан мумкин аст:

import electric_car as ec  

Баъд номи кӯтоҳи модулро бо номи пурраи класс истифода мебарем:

my_leaf = ec.ElectricCar('nissan', 'leaf', 2024)  

Ёфтани тарзи кори мувофиқи худ

Чунон ки мебинед, Python барои ташкили коди лоиҳаи калон роҳҳои гуногун медиҳад.

Донистани ин имкониятҳо муҳим аст, то ҳам сохтори мувофиқи лоиҳаи худро интихоб кунед ва ҳам лоиҳаҳои дигаронро фаҳмед.

Дар оғоз сохтори кодро сода нигоҳ доред.

Кӯшиш кунед аввал ҳама чизро дар як файл нависед ва пас аз дуруст кор кардани барнома классҳоро ба модулҳои ҷудогона гузаронед.

Агар кор бо модулҳо бароятон қулай бошад, метавонед аз оғози лоиҳа классҳоро дар модулҳо нигоҳ доред.

Роҳеро пайдо кунед, ки ба шумо имкон медиҳад коди коркунанда нависед ва аз ҳамон ҷо пеш равед.

Худатон бисанҷед

9-10. Тарабхонаи воридшуда: Нусхаи охирини Restaurant-ро дар модул нигоҳ доред.

Файли ҷудогонае созед, ки Restaurant-ро ворид кунад.

Намунаи Restaurant созед ва яке аз методҳояшро даъват намоед, то кори дурусти воридкуниро нишон диҳед.

9-11. Мудири воридшуда: Аз кори машқи 9-8 оғоз кунед.

User, Privileges ва Admin-ро дар як модул нигоҳ доред.

Дар файли ҷудогона намунаи Admin созед ва show_privileges()-ро даъват кунед, то дуруст кор кардани ҳама чизро нишон диҳед.

9-12. Якчанд модул: User-ро дар як модул ва Privileges ва Admin-ро дар модули дигар нигоҳ доред.

Дар файли ҷудогона намунаи Admin созед ва show_privileges()-ро даъват намоед, то боварӣ ҳосил кунед, ки ҳама чиз ҳанӯз дуруст кор мекунад.

Китобхонаи стандартии Python

Китобхонаи стандартии Python маҷмӯи модулҳоест, ки ҳамроҳи ҳар насби Python меояд.

Акнун, ки тарзи кори функсияҳо ва классҳоро ба таври ибтидоӣ медонед, метавонед истифодаи чунин модулҳои навиштаи дигар барномасозонро оғоз кунед.

Барои истифодаи функсия ё класси китобхонаи стандартӣ одатан навиштани дастури мувофиқи import дар аввали файл кофӣ аст.

Модули random-ро дида мебароем, ки барои моделсозии бисёр ҳолатҳои воқеӣ муфид мебошад.

Яке аз функсияҳои ҷолиби он randint() аст.

Ин функсия ду аргументи адади бутунро қабул карда, адади бутуни тасодуфиеро аз байни онҳо бармегардонад. Ҳар ду адади ҳудудӣ низ ба интихоби имконпазир дохил мешаванд.

Барои гирифтани адади тасодуфӣ аз 1 то 6:

>>> from random import randint  
>>> randint(1, 6)  
3  

Функсияи дигари муфид choice() аст.

Он рӯйхат ё кортежро қабул карда, як унсури тасодуфиро бармегардонад:

>>> from random import choice  
>>> players = ['charles', 'martina', 'michael', 'florence', 'eli']  
>>> first_up = choice(players)  
>>> first_up  
'florence'  

Модули random-ро барои вазифаҳои марбут ба амнияти иттилоотӣ истифода бурдан лозим нест, аммо он барои лоиҳаҳои зиёди шавқовар мувофиқ аст.

Эзоҳ: Модулҳоро аз манбаъҳои беруна низ зеркашӣ кардан мумкин аст. Дар боби 11 бо яке аз онҳо — pytest — кор мекунем; онро бо pip насб мекунем.

Худатон бисанҷед

9-13. Зар: Класси Die созед, ки як атрибути sides дошта бошад. Қимати пешфарзаш 6 бошад.

Методи roll_die() нависед, ки адади тасодуфиеро аз 1 то шумораи рӯйҳои зар чоп кунад.

Зари шашрӯя созед ва онро 10 бор партоед.

Баъд зари даҳрӯя ва бистрӯя созед. Ҳар кадомро 10 бор партоед.

9-14. Қуръакашӣ: Рӯйхат ё кортеже аз 10 адад ва 5 ҳарф созед.

Аз он 4 адад ё ҳарфро ба таври тасодуфӣ интихоб кунед.

Паёме чоп намоед, ки ҳар чиптаи мувофиқ ба ин чор адад ё ҳарф ҷоиза мебарад.

9-15. Таҳлили қуръакашӣ: Бо давр метавон санҷид, ки бурд кардан дар қуръакашии моделкардаатон то чӣ андоза душвор аст.

Рӯйхат ё кортеже бо номи my_ticket созед.

Давре нависед, ки то бурд кардани чиптаи шумо интихоби ададҳоро идома диҳад.

Дар охир хабар диҳед, ки барои гирифтани чиптаи бурднок давр чанд бор иҷро шуд.

9-16. Модули ҳафтаи Python: Яке аз манбаъҳои хуби омӯзиши китобхонаи стандартӣ сомонаи Python Module of the Week мебошад.

Ба pymotw.com рафта, мундариҷаро бинед.

Модули бароятон ҷолибро интихоб карда, дар борааш хонед. Метавонед аз random оғоз кунед.

Услуби навиштани классҳо

Чанд қоидаи услубии классҳоро равшан кардан лозим аст, махсусан вақте барномаҳо мураккабтар мешаванд.

Номҳои классҳо бояд бо услуби CamelCase навишта шаванд: ҳар калима бо ҳарфи калон оғоз мешавад ва байни калимаҳо зерхат гузошта намешавад.

Масалан:

ElectricCar  
IceCreamStand  

Номҳои намунаҳо ва модулҳо бояд бо ҳарфҳои хурд ва зерхат байни калимаҳо навишта шаванд:

my_car  
electric_car  

Ҳар класс бояд бевосита пас аз таъриф docstring дошта бошад.

Ин тавсиф бояд кӯтоҳ фаҳмонад, ки класс чӣ кор мекунад. Қоидаҳои навишти он бо docstring-и функсияҳо яксонанд.

Ҳар модул низ бояд тавсифе дошта бошад, ки мақсади классҳои дохили онро фаҳмонад.

Барои тартиб додани код сатрҳои холиро истифода баред, аммо аз ҳад зиёд не.

Дар дохили класс байни методҳо як сатри холӣ гузоштан мумкин аст. Дар модул байни классҳо ду сатри холӣ гузоред.

Агар ҳам модули китобхонаи стандартӣ ва ҳам модули навиштаи худро ворид кунед, аввал дастури воридкунии модули стандартиро нависед.

Баъд як сатри холӣ гузошта, модули худро ворид намоед.

Дар барномаҳое, ки дастурҳои зиёди import доранд, ин қоида фаҳмидани манбаи модулҳоро осон мекунад.

Хулоса

Дар ин боб шумо навиштани классҳои худро омӯхтед.

Фаҳмидед, ки чӣ гуна бо атрибутҳо маълумотро нигоҳ доред ва бо методҳо рафтори заруриро муайян кунед.

Навиштани методҳои __init__()-ро омӯхтед, ки атрибутҳои дилхоҳи намунаҳои навро омода мекунанд.

Дидед, ки атрибутҳои намунаро ҳам мустақиман ва ҳам тавассути методҳо тағйир додан мумкин аст.

Омӯхтед, ки меросбарӣ сохтани классҳои ба ҳам алоқамандро осон мекунад.

Ҳамчунин фаҳмидед, ки барои сода нигоҳ доштани ҳар класс метавон намунаи як классро ҳамчун атрибути класси дигар истифода бурд.

Дидед, ки нигоҳ доштани классҳо дар модулҳо ва ворид кардани классҳои зарурӣ ба файлҳои истифодабаранда лоиҳаро мураттаб нигоҳ медорад.

Бо китобхонаи стандартии Python шинос шудед ва мисолҳои модули random-ро дидед.

Дар охир қоидаҳои услубии навиштани классҳоро омӯхтед.

Дар боби 10 кор бо файлҳоро меомӯзед, то натиҷаи кори барнома ва маълумоти воридкардаи корбаронро нигоҳ доред.

Ҳамчунин бо истисноҳо — exceptions — шинос мешавед: онҳо дар Python барои вокуниш нишон додан ба хатоҳо ҳангоми ба вуҷуд омаданашон истифода мешаванд.

пешина
аз 13
навбатӣ