ដោយថ្នាក់ក៏ជា scope មួយដែរ ដូចនេះ attribute នៅក្នុងថ្នាក់និមួយៗ មិនអាចត្រូវច្រឡំទៅនឹង attribute នៅក្នុងថ្នាក់ផ្សេងៗទៀតបានឡើយ ទោះបីជាវត្ថុទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ម៉្យាងទៀត អត្ថប្រយោជន៍នៃការបង្កើតថ្នាក់ គឺដើម្បីអាចបង្កើតវត្ថុខុសៗគ្នា។ ហើយបើគ្មានថ្នាក់ទេ បញ្ហាឈ្មោះជាន់គ្នានឹងកើតមានឡើង។
ក្នុងករណីមាន inheritance ដែលនៅក្នុងថ្នាក់និមួយៗមាន attribute មានឈ្មោះដូចគ្នា នៅពេលដែល attribute ទាំងនោះត្រូវយកមកប្រើ attribute ដែលត្រូវរកឃើញមុនគេ នឹងត្រូវយើងមកប្រើ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
class Area(): pi = 3.14 def __init__(self, dimension): self.dimension = dimension def surface(self): print('surface') class Rectangle(Area): def __init__(self, width, height): self.width = width self.height = height def surface(self): area = self.width * self.height print('The area of rectangle is', area) class Triangle(Rectangle): def __init__(self, edge, height): self.edge = edge self.height = height def surface(self): area = self.edge * self.height / 2 print('The area of triangle is', area) triangle = Triangle(25, 5) rectangle = Rectangle(25, 5) triangle.surface() rectangle.surface()
The area of triangle is 62.5 The area of rectangle is 125
នៅពេលដែលយើងបង្កើត method នៅក្នុង subclass មានឈ្មោះដូច method នៅក្នុង superclass គេនិយាយថា method នៅក្នុង subclass របស់យើង override method នៅក្នុង superclass ។ ក្នុងករណីនេះ method នៅក្នុង subclass ត្រូវហៅថា overriding method និង method នៅក្នុង superclas ត្រូវហៅថា overridden method ។
មួយវិញទៀត ក្នុងករណីដែល superclass និង subclass មាន attribute មានឈ្មោះដូចគ្នា នៅពេលដែលយើងយក attribute មានឈ្មោះដូចគ្នាទៅប្រើ attribute ដែលត្រូវយកទៅប្រើ គឺអាស្រ័យទៅលើ instance ដែលតាមរយៈវា attribute នោះត្រូវយកទៅប្រើ។ ជាក់ស្តែង នៅក្នុងកម្មវិធីខាងលើ method ឈ្មោះ surface() នៃថ្នាក់ណាមួយត្រូវបាន call គឺអាស្រ័យទៅលើ instance ដែលតាមរយៈវា method នោះត្រូវបាន call ។ គឺថា បើជា instance នៃថ្នាក់ឈ្មោះ Triangle គឺ method ឈ្មោះ surface() នៅក្នុងថ្នាក់ឈ្មោះ Triangle នោះ ដែលត្រូវ call ។ តែបើជា instance នៃថ្នាក់ឈ្មោះ Rectangle វិញ គឺជា method ឈ្មោះ surface() នៅក្នុងថ្នាក់ឈ្មោះ Rectangle នោះ ដែលត្រូវ call ។ ដូចនេះ method ឈ្មោះ surface() អាចប្រែក្រឡាជា method នៃថ្នាក់ណាមួយក៏បានដែរ គឺអាស្រ័យទៅលើ instance ដែលតាមរយៈវា method នោះត្រូវយកទៅប្រើ។
នៅក្នុងភាសា Python ភាពដែលអាចប្រែក្រឡាបាននេះត្រូវហៅថា polymorphism ដែលជាចំណុចដ៏សំខាន់មួយនៅក្នុងការសរសេរកម្មវីធីដោយបង្កើតថ្នាក់ផ្សេងៗ (OOP) ។
យ៉ាងណាម៉ិញ យើងបានដឹងរួចមកហើយថា នៅពេលដែលយើងយក method មានឈ្មោះដូចគ្នាមកប្រើតាមរយៈ instance របស់ subclass គឺ overriding method នៅក្នុង subclass ដែលត្រូវបាន call ព្រោះវាត្រូវបានរកឃើញមុនគេ។ ក៏ប៉ុន្តែ បើសិនជាយើងចង់អោយ overridden method នៅក្នុង superclass ត្រូវបាន call ដែរ នៅពេលដែល overriding method ត្រូវបាន call យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
class Area(): pi = 3.14 def __init__(self, *dimension): self.dimension = dimension def surface(self): return self.dimension class Rectangle(Area): def __init__(self, width, height): super().__init__(width, height) def surface(self): dimension = super().surface() area = self.dimension[0] * self.dimension[1] return area class Triangle(Rectangle): def __init__(self, edge, height): super().__init__(edge, height) def surface(self): area = super().surface() / 2 print('The area of triangle is', area) triangle = Triangle(25, 5) triangle.surface()
The area of triangle is 62.5