You are on page 1of 14

X ლექცია

კონსტრუქტორები, დესტრუქტორები.
ინკაფსულაცია

gachechiladze_lela@yahoo.com
კლასები და ობიექტები
კლასი წარმოადგენს ობიექტის შაბლონს, მის ფორმალურ აღწერას. ობიექტი
კლასის ეგზემპლარია, მისი რეალური განსახიერება. მაგალითად: თითოეულ
ჩვენგანს აქვს წარმოდგენა ადამიანის შესახებ - ორი ხელი, ორი ფეხი, თავი,
ნერვული სისტემა, თავის ტვინი და ა.შ. მაშასადამე, არსებობს ადამიანის გარკვე-
ული შაბლონი. ეს შაბლონი კლასია. რეალურად არსებული ადამიანი კი ამ კლასის
ობიექტია.
კოდის გათვალისწინებით, კლასი აერთიანებს ფუნქციებისა და ცვლადების
ნაკრებს, რომელიც განსაზღვრულ ამოცანას ასრულებს. კლასის ფუნქციებს
მეთოდებსაც უწოდებენ. ისინი კლასის ქცევას განსაზღვრავენ. კლასის ცვლადებს
ატრიბუტები ეწოდება. ისინი კლასის მდგომარეობას ინახავენ.
კლასი class საკვანძო სიტყვის გამოყენებით განისაზღვრება:
class კლასის სახელი:
კლასის მეთოდები
კლასის ობიექტის შესაქმნელად შემდეგი სინტაქსი გამოიყენება:
ობიექტის სახელი = კლასის სახელი([პარამეტრები])

gachechiladze_lela@yahoo.com 2
Person კლასი
class Person: შედეგები:
name='George.'
def display_info(self):
print('Hello! My name is ', self.name)
person1=Person()
person1.display_info()
person2=Person()
person2.name='Nick.'
person2.display_info()

Person კლასი name ატრიბუტს განსაზღვრავს, რომელიც ადამიანის სახელს


ინახავს. display_info() მეთოდით ადამიანის შესახებ ინფორმაცია გამოიტანება კონ-
სოლზე.
კლასში განსაზღვრულმა მეთოდებმა პირველი პარამეტრის სახით მიმდინარე
ობიექტზე მიმართვა უნდა მიიღონ. ამ უკანასკნელს self ეწოდება. აღნიშნული
მიმართვით, კლასის შიგნით, შეგვიძლია წვდომა ვიქონიოთ ამავე კლასის მეთო-
დებსა და ატრიბუტებზე. კერძოდ, ჩვენ შემთხვევაში, self.name გამოსახულებით
ვიღებთ ადამიანის სახელს.
display_info() მეთოდის გამოძახების დროს self პარამეტრზე მნიშვნელობის მი-
ნიჭება არ ხდება!
gachechiladze_lela@yahoo.com 3
კონსტრუქტორები
კლასის ობიექტის შესაქმნელად კონსტრუქტორი გამოიყენება.
წინა (მე-3) სლაიდზე Person კლასის ობიექტის შექმნის დროს ჩვენ გამოვიყენეთ
default კონსტრუქტორი, რომელიც არაცხადი სახით ყველა კლასს გააჩნია.
კლასებში კონსტრუქტორი ცხადი სახითაც შეგვიძლია განვსაზღვროთ. ამ მიზ-
ნით __init__(self) მეთოდი გამოიყენება.
კონსტრუქტორის გათვალსიწინებით შევცვალოთ წინა სლაიდზე წარმოდგენი-
ლი კოდი შემდეგი სახით:
class Person:
def __init__(self, name): #კონსტრუქტორი შედეგები:
self.name=name #სახელის დაყენება
def display_info(self):
print('Hello! My name is ', self.name)
person1=Person('George.')
person1.display_info()
person2=Person('Nick.')
person2.display_info()

გამოსახულება self.name=name არაცხადი სახით ქმნის name ატრიბუტს.

gachechiladze_lela@yahoo.com 4
დესტრუქტორი
კლასის ობიექტთან მუშაობის დასრულების შემდეგ, del ოპერატორით შეგვიძ-
ლია ობიექტის ოპერატიული მეხსიერებიდან წაშლა.
person1 = Person(“George.")
del person1 # მეხსიერებიდან წაშლა
# person1.display_info() # ეს მეთოდი არ იმუშავებს, რადგან person1 წაშლილია
#მეხსიერებიდან.
აღსანიშნავია, რომ ამის გაკეთება სავალდებულო არ არის, რადგან კოდის მუ-
შაობის დასრულების შემდეგ ყველა ობიექტი ავტომატურად იშლება მეხსიერები-
დან. ამას გარდა, კლასში შეგვიძლია განვსაზღვროთ დესტრუქტორი __del__(self)
ჩაშენებული ფუნქციის გამოყენებით, რომელიც ან del ოპერატორის გამოძახების
შედეგად, ან ობიექტის ავტომატურად წაშლის დროს გამოიძახება.
დესტრუქტორის ჩამატებით ჩვენი კოდი მომდევნო სლაიდზეა წარმოდგენილი.

gachechiladze_lela@yahoo.com 5
Person კლასის საბოლოო სახე:
class Person: შედეგები:

def __init__(self, name): #კონსტრუქტორი


self.name=name #სახელის დაყენება
def __del__(self): #დესტრუქტორი
print(self.name, 'removed from memory')
def display_info(self):
print('Hello! My name is ', self.name)
person1=Person('George')
person1.display_info()
del person1 #მეხსიერებიდან წაშლა
person2=Person('Nick')
person2.display_info()

gachechiladze_lela@yahoo.com 6
კლასების მოდულებში განსაზღვრა და გამოყენება
როგორც წესი, კლასები თავსდება ცალკეულ მოდულებში და შემდგომ ხდება
მათი იმპორტირება პროგრამის მთავარ სკრიპტში.
მოდულში ერთზე მეტი კლასიც შეიძლება იქნეს განთავსებული.
მოდულების იმპორტირება შესაძლებელია import ბრძანების გამოყენებით ან
მოდულიდან ცალკეული კლასების იმპორტირების მიზნით from ბრძანების გამო-
ყენებით. განვიხილოთ შესაბამისი პროგრამული კოდი.

შედეგები:

gachechiladze_lela@yahoo.com 7
ინკაფსულაცია
მიუთითებლობის შემთხვევაში, კლასის ატრიბუტები ღია წვდომის არის. ეს კი
ნიშნავს, რომ პროგრამის ნებისმიერი ადგილიდან შეგვიძლია ობიექტის ატრიბუ-
ტის მიღება და მისი შეცვლა.
აღნიშნულის საილუსტრაციოდ შემდეგი პროგრამა განვიხილოთ:
class Person:
def __init__(self, name):
self.name=name შედეგები:
self.age=20
def display_info(self):
print('სახელი: ', self.name, "\tასაკი: ", self.age)
person1=Person('George')
person1.name='Nick' #სახელის შეცვლა
person1.age=-125 #ასაკის შეცვლა
person1.display_info()

ამ შემთხვევაში, ჩვენ შეგვიძლია ადამიანის სახლს ან ასაკს არაკორექტული


მნიშვნელობა მივცეთ (ასაკი=-125). ასეთ სიტუაციებში დგება ობიექტის ატრიბუ-
ტებზე წვდომის კონტროლის საკითხი. ამ პრობლემას მჭიდროდ უკავშირდება
ინკაფსულაციის ცნება.
ინკაფსულაცია ობიექტზე ორიენტირებული დაპროგრამების ფუნდამენტური
კონცეფციაა. ის ობიექტის ატრიბუტებზე პირდაპირ წვდომას ხელს უშლის გამომ-
ძახებელი კოდიდან. gachechiladze_lela@yahoo.com 8
ინკაფსულაციის მაგალითი
Python დაპროგრამების ენაში კლასის ატრიბუტების დაფარვა შესაძლებელია იმ
შემთხვევაში, თუ ამ ატრიბუტებს წარმოვადგენთ როგორც პრივატულს (დახუ-
რულს) და მათზე წვდომას შევზღუდავთ სპეციალური მეთოდების საშუალებით,
რომელთაც თვისებებს უწოდებენ.
წინა (მე-8 სლაიდზე) ნაჩვენები კლასი შევცვალოთ თვისებების დამატებით.
class Person:
def __init__(self, name):
self.__name=name შედეგები:
self.__age=20
def set_age(self, age):
if age in range(1,100):
self.__age=age
else:
print('არასწორი ასაკი')
def get_age(self):
return self.__age
def get_name(self):
return self.__name
def display_info(self):
print('სახელი: ', self.__name, "\tასაკი: ", self.__age)
person1=Person('George')
person1.display_info()
person1.set_age(-125)
person1.set_age(50)
person1.display_info()
9
gachechiladze_lela@yahoo.com
პრივატული ატრიბუტები, გეტერები და სეტერები
Python დაპროგრამების ენაში პრივატული ატრიბუტის შესაქმნელად, ატრიბუ-
ტის სახელის წინ ორი ხაზგასმა (ორი ქვედა ტირე) გამოიყენება: self.__name. ასეთ
ატრიბუტზე მიმართვა მხოლოდ მისივე კლასიდან არის შესაძლებელი, მაგრამ
მიმართვას ვერ განვახორციელებთ კლასის გარედან.
მაგალითად, ჩანაწერი: person.__age=45, არაფერს მოგვცემს, რადგან ამ შემთხვე-
ვაში, დინამიურად განისაზღვრება ახალი ატრიბუტი __age, რომელსაც არაფერი
საერთო არ გააჩნია self.__age ატრიბუტთან. ხოლო, თუ ადრე არ იყო განსაზღვრუ-
ლი ცვლადი __age, მისი მნიშვნელობის მიღების მცდელობა შესრულების შეცდო-
მას გამოიწვევს. თუმცა შესაძლებელია ასაკის მითითება ჩვენ კლასის გარედან
დაგვჭირდეს. სწორედ ამ მიზნით იქმნება თვისებები.
ერთი თვისების გამოყენებით შეგვიძლია ატრიბუტის მნიშვნელობის მიღება:
def get_age(self):
return self.__age
აღნიშნულ მეთოდს ხშირად გეტერს ან აქსესორს უწოდებენ.
ასაკის შესაცვლელად სხვა თვისება განისაზღვრება:
def set_age(self, age):
if age in range(1,100):
self.__age=age
else:
print('არასწორი ასაკი')
აღნიშნულ მეთოდს სეტერს ან მუტატორს (mutator) უწოდებენ.
10
gachechiladze_lela@yahoo.com
თვისებების ანოტაციები
თვისებების (გეტერებისა და სეტერების) განსაზღვრის კიდევ ერთი ელეგანტუ-
რი საუალება გააჩნია Python-ს, რომელიც ანოტაციების გამოყენებას გულისხმობს
და ეს უკანასკნელი @ სიმბოლოთი იწყება.
თვისება-გეტერის შესქმნელად, მის ჩაწერამდე (გეტერის ზემოთ) იწერება
ანოტაცია: @property.
თვისება-სეტერის შესაქმნელად მის ჩაწერამდე (სეტერის ზემოთ) იწერება
ანოტაცია: @გეტერის თვისების სახელი.setter.
ზემოაღნიშნულის გათვალისწინებით ჩვენი კოდი მიიღებს შემდეგ სახეს:

class Person: @property


def __init__(self, name): def name(self):
self.__name=name return self.__name
self.__age=20 def display_info(self):
@property print('სახელი: ', self.__name,
def age(self): "\tასაკი: ", self.__age)
return self.__age person1=Person('George')
@age.setter person1.display_info()
def age(self, age): person1.age=-125
if age in range(1,100): person1.age=50
self.__age=age person1.display_info()
else:
print('არასწორი ასაკი')

11
gachechiladze_lela@yahoo.com
თვისებების ანოტაციების ამსახველი კოდი

12
gachechiladze_lela@yahoo.com
მე-13 სლაიდზე წარმოდგილი კოდის შესრულების
შედეგები:

მიაქციეთ ყურადღება იმ ფაქტს, რომ თვისება-სეტერი განისაზღვრება თვისება-


გეტერის შემდეგ! ამასთან, სეტერს და გეტერს ერთი და იგივე სახელი (age) აქვს.

13
gachechiladze_lela@yahoo.com
გისურვებთ წარმატებულ სწავლას!

gachechiladze_lela@yahoo.com 14

You might also like