យើងបានដឹងរួចមកហើយថា instance គឺជាវត្ថុដែលជាលទ្ធផលបានមកពីការយកថ្នាក់មកប្រើ។ ដូចនេះ instance ក៏មានលក្ខណៈដូចជាវត្ថុដទៃទៀតដែរ បានន័យថា នៅកន្លែងណាដែលវត្ថុផ្សេងៗអាចចត្រូវយកទៅប្រើបាន instance ក៏អាចត្រូវយកទៅប្រើបានដូចគ្នាដែរ។ មួយវិញទៀត instance គឺជាវត្ថុទទេស្អាតមួយ ក្រោយពីត្រូវបានបង្កើតឡើង តែវាមានទំនាក់ទំនងយ៉ាងជិតស្និទ្ធិជាមួយនឹងថ្នាក់របស់វា ហើយគឺដោយសារ instance នេះហើយ ដែលយើងអាចយក method ផ្សេងៗនៅក្នុងថ្នាក់ទៅប្រើនៅក្នុង scope ដទៃទៀតបាន។
យើងគួររំលឹកឡើងវិញថា នៅពេលដែលយើងយកវិធីណាមួយមកប្រើតាមរយៈ instance ណាមួយ instance នោះនឹងត្រូវផ្តល់ជា argument អោយទៅ parameter នៅក្នុងវិធីនោះជាស្វ័យប្រវត្តិ។ យន្តការនេះជាច្បាប់នៅក្នុងភាសា Python ។
ប្រការដ៏សំខាន់មួយទៀតនោះគឺថា instance គឺជាវត្ថុដែលជាកន្លែងទទេស្អាតមួយនៅក្នុងសតិរបស់ឧបករណ៍អេឡិចត្រូនិក ដូចនេះយើងអាចបង្កើតវត្ថុផ្សេងៗទៀតទុកនៅទីនោះ ដើម្បីកុំអោយច្រឡំទៅនឹងវត្ថុដទៃទៀត ដែលមានឈ្មោះដូចគ្នា។ ហើយដើម្បីបង្កើតវត្ថុផ្សេងៗទុកនៅក្នុង instance យើងត្រូវធ្វើដូចខាងក្រោមនេះ៖
class Area():
pi = 3.14
def __init__(self):
print('The constructor has been called.')
def rectangle(self, width, height):
area = width * height
return area
instance = Area()
instance.width = 25
instance.height = 5
print(instance.width)
print(instance.height)
នៅក្នុងកម្មវិធីខាងលើ យើងឃើញថា វត្ថុឈ្មោះ width និងវត្ថុឈ្មោះ height ត្រូវបានបង្កើតឡើងនិងទុកនៅក្នុង instance នៃថ្នាក់ឈ្មោះ Area ។ វត្ថុទាំងនោះត្រូវហៅថា instance attribute ដែលអាចជាវត្ថុប្រភេទណាក៏បានដែរ។ ក៏ប៉ុន្តែ ភាគច្រើន គេនិយមបង្កើតវត្ថុដែលជាទិន្នន័យផ្សេងៗទុកនៅក្នុង instance ដើម្បីកុំអោយច្រឡំទៅនឹងវត្ថុផ្សេងៗទៀត ដែលមានឈ្មោះដូចគ្នា។
យ៉ាងណាម៉ិញ ការបង្កើត instance attribute អាចត្រូវធ្វើឡើងតាមរបៀបមួយទៀតដូចខាងក្រោមនេះ៖
class Area():
pi = 3.14
def __init__(self, width, height):
self.width = width
self.height = height
def rectangle(self, width, height):
area = width * height
return area
instance = Area(25, 5)
print(instance.width)
print(instance.height)
យើងឃើញថា ការបង្កើត instance attribute អាចត្រូវធ្វើឡើងនៅខាងក្រៅថ្នាក់ក៏បាន និងឬនៅក្នុងថ្នាក់ក៏បាន។ ក៏ប៉ុន្តែ ការបង្កើត instance attribute នៅខាងក្នុងថ្នាក់ គឺត្រូវធ្វើឡើងនៅក្នុងវិធីណាមួយ ហើយជាទូទៅ គេច្រើនប្រើ constructor ជាកន្លែងសំរាប់បង្កើត instance attribute ផ្សេងៗ។ អាស្រ័យហេតុនេះ បានជា constructor នៅក្នុងភាសា Python មានឈ្មោះជា __init__ ព្រោះវាមាននាទីជាអ្នកបង្កើត instance attribute ទាំងឡាយ។
យ៉ាងណាម៉ិញ ក្រោយពី instance attribute ត្រូវបានបង្កើតរួចហើយ យើងអាចយកវត្ថុទាំងនោះទៅធ្វើការដោះដូរថ្មីបានគ្រប់ពេលវេលា។ ហើយការដោះដូរនេះ អាចត្រូវធ្វើឡើងនៅខាងក្នុងថ្នាក់ក៏បាន នៅខាងក្រៅថ្នាក់ក៏បាន។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
class Area():
pi = 3.14
def __init__(self, width, height):
self.width = width
self.height = height
def attribute(self, width):
self.width = width
def rectangle(self, width, height):
area = width * height
return area
instance = Area(25, 5)
instance.attribute(50)
instance.height = 10
print('New width is', instance.width)
print('New height is', instance.height)
ការបង្កើត instance ក៏ជាការបង្កើត scope មួយដែរ ដូចនេះវត្ថុដែលជា instance attribute និមួយៗមិនអាចត្រូវច្រឡំគ្នាបានឡើយ ទោះបីជាវាមានឈ្មោះដូចគ្នាក៏ដោយ ពីព្រោះវាស្ថិតនៅក្នុង scope ដែលជា instance ខុសៗគ្នា។ ហើយនៅពេលដែលយើងយក instance attribute ណាមួយមកប្រើ តាមរយៈ instance ណាមួយ ការស្វែងរក instance attribute នោះត្រូវធ្វើឡើងនៅក្នុង instance នោះមុន រួចបានឡើងទៅថ្នាក់របស់ instance នោះជាបន្តបន្ទាប់។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
class Area():
pi = 3.14
def __init__(self, pi):
self.pi = pi
def rectangle(self, width, height):
area = width * height
return area
instance1 = Area(3.1415)
instance2 = Area(3.141492)
print('The value of pi in the Area class is', Area.pi)
print('The value of pi in instance1 is', instance1.pi)
print('The value of pi in instance2 is', instance2.pi)
ដោយហេតុថា យើងអាចបង្កើត instance attribute មានឈ្មោះដូចគ្នាទៅនឹង data attribute និង instance attribute ដ៏ទៃទៀត អាស្រ័យហេតុនេះ ការប់ុនប៉ងយក data attribute នៅក្នុងថ្នាក់មកធ្វើការដោះដូរតាមរយៈ instance គឹជាការបង្កើត instance attribute ថ្មីទៅវិញទេ។ ពិនិត្យកម្មវិធីខាងក្រោមនេះ៖
class Area():
pi = 3.14
def __init__(self):
print('The constructor has been called.')
def rectangle(self, width, height):
area = width * height
return area
instance = Area()
instance.pi = 3.1415
print('The value of data attribute pi is', Area.pi)
print('The value of instance attribute pi is', instance.pi)
សរុបមក យើងឃើញថា គ្រប់ការយក data attribute មកធ្វើការដោះដូរ ត្រូវតែត្រូវធ្វើឡើងតាមរយៈថ្នាក់របស់វា។ មួយវិញទៀត data attribute និង method ទាំងឡាយនៅក្នុងថ្នាក់ ហាក់ដូចជាសម្បត្តិសាធារណៈមួយចំនួន ដែលអាចត្រូវយកទៅប្រើប្រាស់តាមរយៈ instance ណាមួយក៏បានដែរ អោយតែ instance ទាំងនោះជា instance នៃថ្នាក់ដែលមានសម្បត្តិទាំងនោះ។ ក៏ប៉ុន្តែ ចំពោះ instance attribute វិញ វាជាវត្ថុផ្ទាល់ខ្លួនរបស់ instance និមួយៗ ទោះបីជាវត្ថុទាំងនោះមានឈ្មោះដូចគ្នាក៏ដោយ។ ហើយគ្រប់ការយក instance attribute ណាមួយទៅប្រើ គឺត្រូវធ្វើឡើងតាមរយៈ instance នោះ៕