Կարող եք ձեր կոդը փորձարկել այստեղ
Սովորաբար կլասերը արտացոլում են շրջապատող իրականության որոշ առարկաներ: Բայց երբեմն մենք պետք է աշխատենք սուբյեկտների հետ, որոնք չունեն կոնկրետ մարմնավորում: Օրինակ՝ «կենդանի» էությունը։ Կան կոնկրետ կենդանիներ՝ կատու, շուն և այլն, բայց կենդանին որպես այդպիսին չունի կոնկրետ մարմնավորում։ Կամ «երկրաչափական գործչի» էությունը։ Կա ուղղանկյուն, քառակուսի, շրջան, եռանկյուն, բայց ինքնին երկրաչափական պատկերը նույնպես չունի կոնկրետ մարմնավորում։ Եվ սովորաբար աբստրակտ կլասերը օգտագործվում են նման սուբյեկտները նկարագրելու համար:
Python-ում աբստրակտ կլասեր ստեղծելու բոլոր գործիքները սահմանվում են հատուկ մոդուլում abc , որը պետք է լրացուցիչ ներառվի հավելվածում:
import abc
Այս մոդուլի հիմնական բաղադրիչներն են ABC կլասը և @abstractmethod ծանոթագրությունը : ABC կլասը հեշտացնում է վերացական կլասի ստեղծումը, և բոլոր աբստրակտ կլասերը, որոնք սահմանված են, ժառանգում են այս կլասից։ @abstractmethod անոտացիան օգտագործվում է վերացական մեթոդ ստեղծելու համար։
Աբստրակտ կլասերը սահմանվում են սովորական կլասերի նման, բացառությամբ, որ դրանք ժառանգում են ABC կլասից մոդուլից abc: Օրինակ, եկեք սահմանենք երկրաչափական գործչի վերացական կլասը.
import abc
class Shape(abc.ABC):
pass
Որպես կանոն, վերացական կլասերը հայտարարում են որոշ ընդհանուր ֆունկցիոնալություն հետնորդ կլասերի համար: Ավելին, որոշ գործառույթներ կարող են չունենալ որևէ իրականացում. դրա իրականացումը պետք է որոշվի հաջորդող կլասերով: Նման ֆունկցիոնալությունը կլասակարգում ձևակերպված է վերացական մեթոդների տեսքով: Օրինակ, երկրաչափական պատկերների կլասը կարող է ունենալ պարագծի, տարածքի և այլնի հաշվարկման մեթոդներ: Մենք չենք կարող որոշել բոլոր թվերի տարածքը հաշվարկելու ընդհանուր բանաձևը. յուրաքանչյուր կոնկրետ գործչի համար տարածքի հաշվարկման սկզբունքը կարող է տարբեր լինել: Հետևաբար, ձևի կլասում մենք կարող ենք տարածքի հաշվարկման մեթոդը սահմանել որպես վերացական: Դա անելու համար օգտագործեք @abstractmethod ծանոթագրությունը մոդուլից abc.
import abc
class Shape(abc.ABC):
@abc.abstractmethod
def area (self): pass
Այս դեպքում մեթոդը area()սահմանվում է որպես վերացական: Քանի որ այն հատուկ ֆունկցիոնալության կարիք չունի, այն կանչում է օպերատորին pass
Հարկ է նշել, որ մենք չենք կարող ուղղակիորեն վերացական կլասի օբյեկտ ստեղծել վերացական մեթոդներով, օգտագործելով դրա կառուցողը.
import abc
class Shape(abc.ABC):
@abc.abstractmethod
def area (self): pass
shape = Shape()
print(shape)
Ստացված կլասերը պետք է իրականացնեն աբստրակտ կլասի բոլոր վերացական մեթոդները: Օրինակ, եկեք սահմանենք ուղղանկյունի կլաս.
import abc
class Shape(abc.ABC):
@abc.abstractmethod
def area (self): pass
# класс прямоугольника
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area (self): return self.width * self.height
rect = Rectangle(30, 50)
print("Rectangle area:", rect.area()) # Rectangle area: 1500
Այստեղ Rectangle կլասի ուղղանկյունը վերցնում է լայնությունը և բարձրությունը կոնստրուկտորի միջով և օգտագործում է դրանք՝ հաշվարկելու տարածքը area().
Նմանատիպ ձևով կարելի է սահմանել այլ տեսակի թվեր: Օրինակ, եկեք ավելացնենք շրջանակի կլաս.
import abc
class Shape(abc.ABC):
@abc.abstractmethod
def area (self): pass # площадь фигуры
# класс прямоугольника
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area (self): return self.width * self.height
# класс круга
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area (self): return self.radius * self.radius * 3.14
def print_area(shape):
print("Area:", shape.area())
rect = Rectangle(30, 50)
circle = Circle(30)
print_area(rect) # Area: 1500
print_area(circle) # Area: 2826.0
Այս դեպքում գործչի մակերեսը ցուցադրելու համար սահմանվում է print_area ֆունկցիան, որն ընդունում է ցանկացած թվանշան։
Միևնույն ժամանակ, վերացական կլասերը կարող են նաև սահմանել կոնստրուկտոր, ատրիբուտներ և ոչ վերացական մեթոդներ, որոնք կարող են օգտագործվել նաև հետնորդ կլասերում.
import abc
class Shape(abc.ABC):
def __init__(self, x, y):
self.x = x
self.y = y
@abc.abstractmethod
def area (self): pass
def print_point(self):
print("X:", self.x, "\tY:", self.y)
# класс прямоугольника
class Rectangle(Shape):
def __init__(self, x, y, width, height):
super().__init__(x, y)
self.width = width
self.height = height
def area (self): return self.width * self.height
rect = Rectangle(10, 20, 100, 100)
rect.print_point() # X: 10 Y: 20
Այստեղ աբստրակտ Shape կլասը իր կոնստրուկտորի միջոցով ընդունում է X և Y կոորդինատները այն կետի համար, որին առնչվում է ձևը (օրինակ, ուղղանկյունի համար դրանք կարող են լինել վերին ձախ անկյունի կոորդինատները, շրջանագծի համար՝ կենտրոն): Եվ սահմանվում է նաև print_point ոչ վերացական մեթոդ, որը մի կետի կոորդինատները տպում է կոնսոլում։
Մեկնաբանություն գրելու համար խնդրում ենք մուտք լինել