You are on page 1of 13

XIV ლექცია

აბსტრაქტული მეთოდები და კლასები

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

gachechiladze_lela@yahoo.com 2
აბსტრაქტული კლასისა და მეთოდის
ამსახველი პროგრამული კოდი:

from abc import ABC, abstractmethod

class ChessPiece(ABC):
# საერთო მეთოდი
def draw(self):
print("Drew a chess piece")

# აბსტრაქტული მეთოდი, რომელიც ყველა მემკვიდრე კლასის მიერ ხელახლა განისაზღვრება


@abstractmethod
def move(self):
pass
a = ChessPiece() #შეცდომაა!!!

პროგრამის შესრულების შედეგი:

ვინაიდან კლასი აბსტრაქტულია და მისი აბსტრაქტული მეთოდი რეალიზებული არ


არის, შესაბამისად, ამ კლასის ობიექტის შექმნა შეუძლებელია!
gachechiladze_lela@yahoo.com 3
აბსტრაქტული კლასები
როგორც წინა სლაიდზე ვნახეთ, აბსტრაქტულ კლასში არსებული მეთოდის
რეალიზება აუცილებელია მემკვიდრე კლასის მიერ. შესაბამისად, პროგრამული
კოდი მიიღებს შემდეგ სახეს:
from abc import ABC, abstractmethod
class ChessPiece(ABC):
# საერთო მეთოდი
def draw(self):
print("Drew a chess piece")
# აბსტრაქტული მეთოდი, რომელიც ყველა მემკვიდრე კლასის მიერ ხელახლა განისაზღვრება
@abstractmethod
def move(self):
პროგრამის შესრულების შედეგი:
pass
class Queen(ChessPiece):
def move(self):
print("Moved Queen to e2e4")
q = Queen()
q.draw()
q.move()
gachechiladze_lela@yahoo.com 4
აბსტრაქტული მეთოდის აბსტრაქულ კლასში
რეალიზება
ყურადღება მიაქციეთ იმ ფაქტს, რომ აბსტრაქტული მეთოდი შესაძლოა აბსტრაქ-
ტულ კლასშივე იქნეს რეალიზებული, მაგრამ მიუხედავად ამისა, @abstractmethod
დეკორატორი დაავალდებულებს პროგრამისტს მემკვიდრე კლასში ან რეალიზება
გაუკეთოს აღნიშნული აბსტრაქტული მეთოდის საკუთარ ვერსიას, ან შეავსოს ის
ბრძანებებით. ასე, მაგალითად:
from abc import ABC, abstractmethod
class Basic(ABC):
@abstractmethod
def hello(self): პროგრამის შესრულების შედეგი:

print("Hello from Basic class")

class Advanced(Basic):
def hello(self):
super().hello()
print("Enriched functionality")
a = Advanced()
a.hello()
gachechiladze_lela@yahoo.com 5
მეტაკლასები
კლასები ობიექტების შესაქმნელად გამოიყენება, მეტაკლასები კი - თავად კლა-
სების შესაქმნელად. მეტაკლასები კლასების ქცევის შესაცვლელად, ან დასამატებ-
ლად არსებობს.
დავუშვათ, გვინდა დარწმუნებული ვიყოთ, რომ ჩვენ ყოველთვის ვქმნით
SchoolMember კლასის ქვეკლასის ეგზემპლარებს და არა თავად SchoolMember კლა-
სის ეგზემპლარებს. ამ მიზნის მისაღწევად შეგვიძლია გამოვიყენოთ კონცეფცია:
„აბსტრაქტული საბაზო კლასები“. ეს ნიშნავს, რომ კლასი აბსტრაქტულია, ანუ ის
რაღაც კონცეფციას წარმოადგენს, რომელიც რეალური კლასის როლში გამოსაყე-
ნებლად არ არის გამიზნული. ჩვენი კლასი შეგვიძლია გამოვაცხადოთ, როგორც
აბსტრაქტული საბაზო კლასი. ამისთვის ABCMeta სახელის მქონე ჩადგმული
კლასი შეგვიძლია გამოვიყენოთ.

gachechiladze_lela@yahoo.com 6
აბსტრაქტული კლასის ამსახველი პროგრამა:

from abc import *

class SchoolMember(metaclass=ABCMeta):

def __init__(self, name, age):

self.name=name

self.age=age

print('კოლეჯის წევრი SchoolMember: ',self.name)

@abstractmethod

def tell(self):

print('სახელი: ', self.name, ' ასაკი: ', self.age, end=' ')

gachechiladze_lela@yahoo.com 7
აბსტრაქტული კლასის ამსახველი პროგრამა
(გაგრძელება):

class Teacher(SchoolMember):

def __init__(self, name, age, salary):

super().__init__(name, age)

self.salary=salary

print('პედაგოგი: ', self.name)

def tell(self):

super().tell()

print('ხელფასი: ', self.salary, end=' ')

print()

gachechiladze_lela@yahoo.com 8
აბსტრაქტული კლასის ამსახველი პროგრამა
(გაგრძელება):

class Student(SchoolMember):

def __init__(self, name, age, marks):

super().__init__(name, age)

self.marks=marks

print('სტუდენტი: ', self.name, end=' ')

def tell(self):

super().tell()

print('შეფასება: ', self.marks, end=' ')

gachechiladze_lela@yahoo.com 9
აბსტრაქტული კლასის ამსახველი პროგრამა
(გაგრძელება):
t = Teacher('ლელა გაჩეჩილაძე', 50, 30000)
s = Student('ბექა რაზმაძე', 20, 75)
print()
members=[t,s]
for member in members:
member.tell()

შედეგები:

gachechiladze_lela@yahoo.com 10
7 ÷10 სლაიდებზე წარმოდგენილი კოდის
ანალიზი
SchoolMember კლასის tell() მეთოდი ჩვენ აბსტრაქტულ მეთოდად გამოვაცხა-
დეთ და ამგვარად, SchoolMember კლასის ეგზემპლარის შექმნა ავტომატურად
ავკრძალეთ. მიუხედავად ამისა, ჩვენ შეგვიძლია Teacher და Student ეგზემპლა-
რებთან მუშაობა ისე, თითქოს ისინი SchoolMember კლასის ეგზემპლარები იყოს,
რადგან ეს კლასები ქვეკლასებს წარმოადგენს.
ამგვარად, ჩვენ გავეცანით ობიექტზე ორიენტირებული დაპროგრამების მთელ
რიგ დადებით მხარეებს და ე.წ. „წყალქვეშა ქვებს“.
პითონი უმაღლესი ხარისხის ობიექტზე ორიენტირებული ენაა, ამიტომ ამ
პრინციპების ცოდნა მნიშვნელოვანია!

gachechiladze_lela@yahoo.com 11
აბსტრაქტული კლასის ამსახველი
პროგრამის ნიმუში:
from abc import *
class parent(metaclass=ABCMeta): #აბსტრაქტული საბაზისო კლასი
def __init__(self, a):
self.a=a
@abstractmethod #აბსტრაქტული მეთოდი
def area(self):
print("გამოთვლა:")
class child(parent):
def __init__(self, a, b):
parent.__init__(self, a)
self.b=b
print("a=", self.a, " ", "b=", self.b, sep='')
def area(self):
parent.area(self) შედეგები:
s=self.a*self.b
print("მართკუთხედის ფართობი=", s, sep='')
a=10 b=12
ob=child(10,12)
გამოთვლა:
ob.area()
მართკუთხედის ფართობი=120

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

gachechiladze_lela@yahoo.com 13

You might also like