Python เป็นภาษาโปรแกรมเชิงวัตถุตั้งแต่มีอยู่ คลาสและอ็อบเจ็กต์เป็นส่วนประกอบหลักสองส่วนในการเขียนโปรแกรมเชิงวัตถุ
คลาสสร้างอ็อบเจ็กต์ประเภทใหม่โดยที่อ็อบเจ็กต์เป็นอินสแตนซ์ของคลาส
มาสร้างคลาสที่ง่ายที่สุดกันเถอะ
กำหนดคลาสใน Python
แค่กำหนดคลาสว่าง
#Define a class class Vehicle(): pass # An empty block # Instantiating objects v = Vehicle() print(v)
ผลลัพธ์
<__main__.Vehicle object at 0x055DB9F0>
สิ่งที่เราได้ทำข้างต้น?
อันดับแรก เราใช้ class statement เพื่อสร้างคลาส Vehicle ใหม่ ตามด้วยบล็อกข้อความที่เยื้องซึ่งประกอบเป็นเนื้อหาของคลาส ในกรณีของเรา เรามีบล็อกว่างซึ่งถูกฟ้องโดยใช้คำสั่ง pass
ต่อไป ในการใช้คลาสรถ เราได้สร้างอ็อบเจ็กต์/อินสแตนซ์ของคลาสนี้โดยใช้ชื่อของคลาส ตามด้วยวงเล็บ จากนั้นเพื่อยืนยันว่ามีการสร้างวัตถุ เราเพียงแค่พิมพ์และรับข้อมูลที่เรามีอินสแตนซ์ของคลาสรถในโมดูล __main__
Object(v) เป็นตัวอย่างของคลาส แต่ละอ็อบเจ็กต์เฉพาะคืออินสแตนซ์ของคลาสเฉพาะ เราสามารถสร้างอินสแตนซ์ของคลาสได้มากเท่าๆ กัน และมีเมธอดและคุณสมบัติของคลาส
เมธอดและตัวแปรทั้งหมดที่กำหนดไว้ในคลาสสามารถเข้าถึงได้จากอ็อบเจ็กต์
กำหนดเมธอดภายในคลาส
class Vehicle(): def car(self): color = 'Red' return color v = Vehicle() print(v.car()) print(v)
ผลลัพธ์
Red <__main__.Vehicle object at 0x05A59690>
วิธีการของอินสแตนซ์
ใน python เมื่อเรากำหนด method ใดๆ ใน class เราจำเป็นต้องจัดเตรียมอาร์กิวเมนต์เริ่มต้นให้กับ method ของ instance ใดๆ ซึ่งก็คือ self หมายความว่าเมื่อเราสร้างวัตถุจากคลาสนั้น วัตถุนั้นเองจะผ่านในวิธีการนั้น
โดยทั่วไป เราไม่ได้ระบุอาร์กิวเมนต์ใดๆ (ตัวเอง) ขณะเรียกใช้ฟังก์ชัน แต่อาร์กิวเมนต์ (ตัวเอง) เป็นสิ่งจำเป็น เมื่อใดก็ตามที่เรากำหนดฟังก์ชันนั้นภายในคลาสนั้น
มาทำความเข้าใจแนวคิดข้างต้นโดยใช้ตัวอย่าง
class myClass(): def myMethod(self): return 'Hello' myInstance = myClass() print(myInstance.myMethod())
ผลลัพธ์
Hello
ดังนั้นในโปรแกรมข้างต้น เรากำหนดคลาส myClass และภายในนั้น เราได้กำหนดเมธอด myMethod() และส่งผ่านอาร์กิวเมนต์เดียวที่เรียกว่า self
อย่างไรก็ตาม เมื่อเราเรียกใช้เมธอดผ่านอินสแตนซ์ของคลาส เราไม่มีอาร์กิวเมนต์ใดๆ เนื่องจากเมื่อใดก็ตามที่เราเรียกใช้เมธอดบนอินสแตนซ์ อาร์กิวเมนต์แรกคืออินสแตนซ์ของคลาส
มาแก้ไขหนึ่งบรรทัดจากโปรแกรมด้านบน-
def myMethod():
ฉันเพิ่งลบอาร์กิวเมนต์ (ตัวเอง) ออกจากวิธีการของฉัน (myMethod()) คราวนี้มาเปิดโปรแกรมอีกครั้งและดูว่าเกิดอะไรขึ้น
================ RESTART: C:\Python\Python361\oops_python.py ================ Traceback (most recent call last): File "C:\Python\Python361\oops_python.py", line 18, in <module> print(myInstance.myMethod()) TypeError: myMethod() takes 0 positional arguments but 1 was given
ดังนั้นการโต้แย้งครั้งแรกของคุณที่มีต่อวิธีการนี้จึงเป็นเรื่องจำเป็น
คุณสมบัติของอินสแตนซ์
เหล่านี้เป็นแอตทริบิวต์เฉพาะวัตถุที่กำหนดเป็นพารามิเตอร์สำหรับวิธีการ __init__ แต่ละอ็อบเจ็กต์มีค่าต่างกันสำหรับตัวเอง
พิจารณาตัวอย่างด้านล่าง
import random class myClass(): def myMethod(self): self.attrib1 = random.randint(1, 11) self.attrib2 = random.randint(1,21) myInst = myClass() myInst.myMethod() print(myInst.attrib1) print(myInst.attrib2)
ผลลัพธ์
2 18
ในโปรแกรมข้างต้น “attrib1” และ “attrib2” เป็นแอตทริบิวต์ของอินสแตนซ์
Init Constructor ใน Python
คอนสตรัคเตอร์คือเมธอดประเภทหนึ่งซึ่งใช้ในการเริ่มต้นสมาชิกอินสแตนซ์ของคลาส
ตัวสร้างสามารถเป็นได้สองประเภท−
- ตัวสร้างแบบกำหนดพารามิเตอร์
- คอนสตรัคเตอร์ที่ไม่มีพารามิเตอร์
ในไพ ธ อน “__init__” เป็นเมธอดเฉพาะที่เกี่ยวข้องกับคลาสไพธอนทุกคลาส
Python เรียกมันโดยอัตโนมัติสำหรับทุกอ็อบเจ็กต์ที่สร้างจากคลาส จุดประสงค์คือเพื่อเริ่มต้นแอตทริบิวต์คลาสด้วยค่าที่ผู้ใช้ระบุ
มันถูกเรียกว่า constructor ในการเขียนโปรแกรมเชิงวัตถุ
class Employee: def __init__(self, name): self.name = name def display(self): print("The name of the employee is: ", self.name) obj1 = Employee('Zack') obj2 = Employee('Rajesh') obj3 = Employee('Tashleem') obj3.display() obj1.display()
ผลลัพธ์
The name of the employee is: Tashleem The name of the employee is: Zack
ในโปรแกรมด้านบน เมื่อเราสร้างอินสแตนซ์ (obj1 &obj2) เราส่งชื่ออาร์กิวเมนต์และตัวสร้างจะกำหนดอาร์กิวเมนต์นั้นให้กับแอตทริบิวต์ของอินสแตนซ์
ดังนั้นเมื่อเราเรียกวิธีการแสดงบนอินสแตนซ์ใดอินสแตนซ์หนึ่ง เราก็จะได้ชื่อนั้นมา
การห่อหุ้มใน Python
การเป็น python นั้นมีลักษณะเป็น oop จึงมีวิธีการจำกัดการเข้าถึงเมธอดและตัวแปร
ด้วยการห่อหุ้มข้อมูล เราไม่สามารถแก้ไขแอตทริบิวต์ของอินสแตนซ์ได้โดยตรงโดยการเรียกแอตทริบิวต์บนวัตถุ จะทำให้แอปพลิเคชันของเราเสี่ยงต่อแฮกเกอร์ อย่างไรก็ตาม เราเปลี่ยนเฉพาะค่าแอตทริบิวต์ของอินสแตนซ์โดยเรียกใช้เมธอดเฉพาะเท่านั้น
ตัวอย่าง
class Product: def __init__(self): self.__maxprice = 1000 self.__minprice = 1 def sellingPrice(self): print('Our product maximum price is: {}'.format(self.__maxprice)) print('Our product minimum price is: {}'.format(self.__minprice)) def productMaxPrice(self, price): self.__maxprice = price def productMinPrice(self, price): self.__minprice = price prod1= Product() prod1.sellingPrice() prod1.__maxprice = 1500 prod1.sellingPrice() prod1.__minprice = 10 prod1.sellingPrice() prod1.productMaxPrice(1500) prod1.sellingPrice() prod1.productMinPrice(10) prod1.sellingPrice()
ผลลัพธ์
Our product maximum price is: 1000 Our product minimum price is: 1 Our product maximum price is: 1000 Our product minimum price is: 1 Our product maximum price is: 1000 Our product minimum price is: 1 Our product maximum price is: 1500 Our product minimum price is: 1 Our product maximum price is: 1500 Our product minimum price is: 10
ในโปรแกรมข้างต้น เราได้สร้างอินสแตนซ์ของคลาส Product และพยายามแก้ไขค่าของตัวแปรอินสแตนซ์ แต่ก็ยังให้ค่าที่ตั้งค่าไว้ภายใน Constructor
วิธีเดียวในการแก้ไขค่าแอตทริบิวต์ของอินสแตนซ์คือการเรียกเมธอด productMaxPrice() หรือ productMinPrice()