Class Instance

យើង​បាន​ដឹង​រួច​មក​ហើយ​ថា instance គឺ​ជា​វត្ថុ​ដែល​ជា​លទ្ធផល​បាន​មក​ពី​ការយក​ថ្នាក់​មក​ប្រើ​។ ដូច​នេះ instance ក៏​មាន​លក្ខណៈ​ដូច​ជា​វត្ថុ​ដទៃ​ទៀត​ដែរ បាន​ន័យ​ថា នៅ​កន្លែង​ណា​ដែល​វត្ថុ​ផ្សេង​ៗ​អាចច​ត្រូវ​យក​ទៅ​ប្រើ​បាន instance ក៏​អាច​ត្រូវ​យក​ទៅ​ប្រើ​បាន​ដូច​គ្នា​ដែរ​។ មួយវិញទៀត instance គឺ​ជា​វត្ថុ​ទទេ​ស្អាត​មួយ ក្រោយ​ពី​ត្រូវ​បាន​បង្កើត​ឡើង តែ​វា​មាន​ទំនាក់ទំនង​យ៉ាង​ជិត​ស្និទ្ធិ​ជាមួយ​នឹង​ថ្នាក់​របស់​វា ហើយ​គឺ​ដោយសារ instance នេះ​ហើយ ដែល​យើង​អាច​យក method ផ្សេង​ៗ​នៅ​ក្នុង​ថ្នាក់​ទៅ​ប្រើ​នៅ​ក្នុង scope ដទៃ​ទៀត​បាន​។

យើង​គួរ​រំលឹក​ឡើង​វិញ​ថា នៅ​ពេល​ដែល​យើង​យក​វិធី​ណា​មួយ​មក​ប្រើ​តាម​រយៈ​ instance ណា​មួយ intance នោះ​នឹង​ត្រូវ​ផ្តល់​ជា 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)
The constructor has been called.
25
5

នៅ​ក្នុង​កម្មវិធី​ខាង​លើ យើង​ឃើញ​ថា ​វត្ថុ​ឈ្មោះ 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)
25
5

យើង​ឃើញ​ថា ការបង្កើត 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)
New width is 50
New height is 10

ការបង្កើត 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)
The value of pi in the Area class is 3.14
The value of pi in instance1 is 3.1415
The value of pi in instance2 is 3.141492

ដោយ​ហេតុ​ថា យើង​អាច​បង្កើត 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)
The constructor has been called.
The value of data attribute pi is 3.14
The value of instance attribute pi is 3.1415

សរុប​មក យើង​ឃើញ​ថា គ្រប់​ការយក data attribute មក​ធ្វើ​ការដោះដូរ ត្រូវ​តែ​ត្រូវ​ធ្វើ​ឡើង​តាម​រយៈ​ថ្នាក់​របស់​វា​។ មួយវិញទៀត data attribute និង method ទាំងឡាយ​នៅ​ក្នុង​ថ្នាក់ ហាក់ដូច​ជា​សម្បត្តិ​សាធារណៈ​មួយ​ចំនួន ដែល​អាច​ត្រូវ​យក​ទៅ​ប្រើប្រាស់​តាម​រយៈ instance ណា​មួយ​ក៏​បាន​ដែរ អោយ​តែ instance ទាំងនោះ​ជា instance នៃ​ថ្នាក់​ដែល​មាន​សម្បត្តិ​ទាំងនោះ​។ ក៏ប៉ុន្តែ ចំពោះ instance attribute វិញ វា​ជា​វត្ថុ​ផ្ទាល់​ខ្លួន​របស់ instance និមួយ​ៗ ទោះ​បី​ជា​វត្ថុ​ទាំងនោះ​មាន​ឈ្មោះ​ដូច​គ្នា​ក៏​ដោយ​។ ហើយ​គ្រប់​ការយក instance attribute ណាមួយ​ទៅ​ប្រើ គឺ​ត្រូវ​ធ្វើ​ឡើង​តាម​រយៈ instance នោះ​៕