
class แล้วตามด้วยชื่อคลาสที่ต้องการตั้ง ตามด้วยโคลอน : จากนั้นก็ตามด้วยบรรทัดที่ร่นเข้าซึ่งในนั้นใส่เนื้อหาโครงสร้างต่างๆของคลาส
class ชื่อคลาส:
เนื้อหาของคลาส
class ผู้กล้า:
0
ผู้กล้า ขึ้นมาแล้ว ซึ่งจะเห็นว่าคลาสนี้ว่างเปล่า แบบนี้ออบเจ็กต์ที่สร้างขึ้นจากคลาสนี้ก็จะไม่มีคุณสมบัติอะไรติดตัวเป็นพิเศษ0 ที่อยู่ในบรรทัดที่ร่นเข้ามานั้นในที่นี้ไม่ได้ทำหน้าที่อะไรแค่ใส่เอาไว้เฉยๆเพื่อไม่ให้โครงสร้างคลาสว่างเปล่าpass ซึ่งเป็นคำสั่งที่ไม่มีการทำงานแต่ใส่เอาไว้เฉยๆเพื่อกันไม่ให้โครงสร้าง ว่างเปล่า แต่ก็ไม่ได้มีความจำเป็นต้องใช้ดังนั้นในที่นี้จะใช้ 0 แทนเมื่อต้องการโครงสร้างที่ว่างเปล่า:) แต่ถ้าไม่ต้องการใส่อะไรเลยก็อาจใส่อะไรสักอย่างที่ไม่แสดงผล= แล้วก็ชื่อคลาสตามด้วยวงเล็บ เช่น
ผู้เล่น1 = ผู้กล้า()
ผู้เล่น1 ซึ่งเป็นออบเจ็กต์ในคลาส ผู้กล้าผู้เล่น1 เป็นคลาสอินสแตนซ์ของคลาส ผู้กล้าผู้เล่น1 เป็นผู้กล้าคนหนึ่ง" แบบนั้นอาจดูเข้าใจง่ายกว่าผู้เล่น2 = ผู้กล้า()
ผู้เล่น1 และ ผู้เล่น2 ต่างก็เป็น ผู้กล้า ทั้งคู่ ลองใช้ type เพื่อหาชนิดดูได้ ก็จะได้ชนิดเป็นคลาสนั้น
print(type(ผู้เล่น1)) # ได้ <class '__main__.ผู้กล้า'>
__main__. ที่เห็นอยู่ด้านหน้าชื่อคลาสที่เราตั้งนี้คือส่วนที่แสดงว่าคลาสนี้ถูกสร้าง ขึ้นภายในโปรแกรมหลัก ไม่ได้เป็นคลาสที่ถูกสร้างขึ้นจากในมอดูลไหนที่เราเรียกใช้เข้ามาclass ผู้กล้า:
0
ผู้เล่น1 = ผู้กล้า()
ผู้เล่น2 = ผู้กล้า()
ผู้เล่น1.ชื่อ = 'เก่งกล้า'
ผู้เล่น1.พลังโจมตี = 5
ผู้เล่น1.พลังป้องกัน = 4
ผู้เล่น2.ชื่อ = 'ชำนาญ'
ผู้เล่น2.พลังโจมตี = 6
ผู้เล่น2.พลังป้องกัน = 3
ผู้เล่น1.พลังโจมตี เพราะอย่าลืมว่าชื่อตัวแปรจะต้องไม่มีจุด . ดังนั้นตรงนี้จึงมีความหมายว่าสร้างแอตทริบิวต์ที่ชื่อว่า พลังโจมตี ให้กับออบเจ็กต์ ผู้เล่น1 พร้อมกับป้อนค่าให้print แล้วก็นำมาคำนวณได้ และสามารถแก้ค่าได้ตามที่ต้องการ
print(ผู้เล่น1.พลังโจมตี) # ได้ 5
ผู้เล่น1.พลังโจมตี = ผู้เล่น1.พลังโจมตี - 1
print(ผู้เล่น1.พลังโจมตี) # ได้ 4
print(type(ผู้เล่น1.พลังโจมตี)) # ได้ <class 'int'>
พลังโจมตีของผู้เล่น1 = 5
พลังโจมตีของผู้เล่น1 ได้ไม่ต่างกันเลยผู้เล่น1.พลังโจมตี = 5
ผู้เล่น1.พลังป้องกัน = 4
ผู้เล่น1พลังโจมตีของผู้เล่น1 = 5
พลังป้องกันของผู้เล่น1 = 4
split(), upper() จำนวนจริงสามารถใช้ is_integer() เป็นต้นdef เพียงแต่ต่างกันแค่ว่า def จะต้องอยู่ภายในโครงสร้างของคลาสdef ใช้นอกคลาสมันก็จะเป็นฟังก์ชันธรรมดา แต่ถ้า def ภายในคลาสก็จะกลายเป็นฟังก์ชันของคลาส ซึ่งก็คือเมธอดclass ผู้กล้า:
def ถูกโจมตี(self,ความเสียหาย):
self.hp -= ความเสียหาย - self.พลังป้องกัน
ผู้กล้า ซึ่งมีเมธอด ถูกโจมตี ซึ่งมีไว้สำหรับคำนวณหักลบค่า hp ของผู้กล้าเวลาที่ถูกโจมตีนั่นเองถูกโจมตี
ผู้เล่น3 = ผู้กล้า()
ผู้เล่น3.hp = 35
ผู้เล่น3.พลังป้องกัน = 30
ผู้เล่น3.ถูกโจมตี(40)
print(ผู้เล่น3.hp) # ได้ 25
ผู้เล่น3.ถูกโจมตี(45)
print(ผู้เล่น3.hp) # ได้ 10
ผู้เล่น3 เป็น ผู้กล้า คนหนึ่ง ซึ่งถูกป้อนค่าให้มี hp เป็น 35 และพลังป้องกันเป็น 30ผู้เล่น3 ไปสู้กับปีศาจแล้วโดนโจมตีได้รับความเสียหาย 40 จึงใช้เมธอด ถูกโจมตี โดยใส่อาร์กิวเมนต์เป็น 40ความเสียหาย ซึ่งจะถูกนำไปลบกับ พลังป้องกัน กลายเป็น 40-30=10 จากนั้นค่านี้ก็จะนำไปหักลบ hp ดังนั้น hp จึงกลายเป็น 35-10=25 ซึ่งค่านี้ก็จะถูก print ออกมาผู้เล่น3 ก็ถูกโจมตีอีกครั้งคราวนี้ 45 ก็ใช้เมธอด ถูกโจมตี อีกครั้ง แต่คราวนี้ hp จะลด 45-30=15 จึงเหลือ hp เป็น 25-15=10def ตามด้วยชื่อเมธอด แล้วก็วงเล็บซึ่งภายในวงเล็บมีพารามิเตอร์อยู่selfself ก็ให้ผลเหมือนกัน เช่นลองเขียนใหม่เป็น
class ผู้กล้า:
def ถูกโจมตี(ตัวเอง,ความเสียหาย):
ตัวเอง.hp -= ความเสียหาย - ตัวเอง.พลังป้องกัน
self ด้วย จะไม่มีการใช้คำอื่นแทนผู้เล่น3.ถูกโจมตี(40)
ความเสียหาย ซึ่งเป็นพารามิเตอร์ตัวที่สองself นั้นจะแทนตัวออบเจ็กต์ที่ถูกเรียกใช้เมธอด ซึ่งในที่นี้ก็คือ ผู้เล่น3self.hp -= ความเสียหาย - self.พลังป้องกัน
ผู้เล่น3.hp -= ความเสียหาย - ผู้เล่น3.พลังป้องกัน
ผู้เล่น3.hp -= 40-30 ดังนั้น hp ของ ผู้เล่น3 จึงลดลงไป 10 นั่นเองพลังป้องกัน จะมี self. นำหน้าเพราะทั้งสองค่านี้เป็นแอตทริบิวต์ของออบเจ็กต์ ส่วน ความเสียหาย เป็นตัวแปรที่รับค่าเข้ามา ไม่ได้เกี่ยวข้องกับออบเจ็กต์ จึงไม่ต้องใส่ self.ชื่อคลาส.ชื่อเมธอด(ออบเจ็กต์,อาร์กิวเมนต์อื่นๆ)
ผู้กล้า.ความเสียหาย(ผู้เล่น3,40)
self ในเมธอดdef อีกอัน เช่นคราวนี้ลองเพิ่มเมธอด ฟื้นพลัง เอาไว้ใช้เวลาที่ได้รับคาถาฟื้นพลังหรือกินยาฟื้นพลัง
class ผู้กล้า:
def ถูกโจมตี(self,ความเสียหาย):
self.hp -= ความเสียหาย - self.พลังป้องกัน
def ฟื้นพลัง(self,พลังฟื้นฟู):
self.hp += พลังฟื้นฟู
ฟื้นพลัง ก็คล้ายๆเมธอด ถูกโจมตี แต่เรียบง่ายกว่า เพราะฟื้นเท่าไหร่ก็บวก hp ไปเท่านั้นเอยclass ผู้กล้า:
def ถูกโจมตี(self,ความเสียหาย):
if(ความเสียหาย>self.พลังป้องกัน()):
self.hp -= ความเสียหาย - self.พลังป้องกัน
else:
self.hp -= 1
if(self.hp<0):
self.hp = 0
def ฟื้นพลัง(self,พลังฟื้นฟู):
self.hp += พลังฟื้นฟู
if(self.hp>self.hpสูงสุด):
self.hp = self.hpสูงสุด
hpสูงสุด ให้กับผู้กล้าด้วย ไม่เช่นนั้นเมื่อเรียกใช้เมธอด ฟื้นพลัง ก็จะขัดข้องทันทีก = ผู้กล้า
print(ก) # ได้ <class '__main__.ผู้กล้า'>
ก กลายเป็นตัวคลาส ผู้กล้า ไปเสียแล้วผู้เล่น3 = ก()
print(type(ผู้เล่น3)) # ได้ <class '__main__.ผู้กล้า'>
ก ถูกใช้แทน ผู้กล้า เพื่อใช้สร้างคลาสขึ้น แต่ว่าคลาสที่สร้างขึ้นมานั้นก็ยังเป็นคลาส ผู้กล้า อยู่__ คือเครื่องหมายขีดล่างสองตัว ในจำนวนนั้นเมธอดพิเศษที่ใช้บ่อยที่สุดก็คือ __init____init__ เป็นเมธอดที่จะทำงานทันทีที่ออบเจ็กถูกประกาศสร้างขึ้นจากคลาสclass ผู้กล้า:
def __init__(self):
print('ผู้กล้าได้ถือกำเนิดขึ้นแล้ว')
ผู้เล่น4 = ผู้กล้า()
__init__() โดยตรง แค่สร้างออบเจ็กต์ขึ้นมาเมธอด __init__() ก็ทำงานแล้วผู้เล่น4.__init__()
__init__ ก็เช่นเดียวกับเมธอดทั่วไปๆ คือจะต้องมีพารามิเตอร์อย่างหน่อยหนึ่งตัว โดยที่ตัวแรกคือตัวแปรที่แทนตัวออบเจ็กต์เอง (ซึ่งก็คือ self)__init__ ด้วย โดยมักจะเอาไว้ใช้เพื่อกำหนดค่าเริ่มต้นให้กับออบเจ็กต์ที่ถูกสร้างจากคลาสclass ผู้กล้า:
def __init__(self,ชื่อ,เลเวล,พลังโจมตี,พลังป้องกัน,hpสูงสุด):
self.ชื่อ = ชื่อ
self.เลเวล = เลเวล
self.พลังโจมตี = พลังโจมตี
self.พลังป้องกัน = พลังป้องกัน
self.hpสูงสุด = hpสูงสุด
self.hp = hpสูงสุด
print('ผู้กล้าได้ถือกำเนิดขึ้นแล้ว')
ผู้กล้า ขึ้นมาก็จะจำเป็นต้องใส่อาร์กิวเมนต์ไปด้วย ซึ่งก็จะกลายมาเป็นค่าเริ่มต้น
ผู้เล่น4 = ผู้กล้า('ยืนยัน',1,5,6,20)
ผู้เล่น4 = ผู้กล้า(ชื่อ='ยืนยัน',เลเวล=1,พลังโจมตี=5,พลังป้องกัน=6,hpสูงสุด=20)
self.เลเวล = เลเวล แต่ความจริงแล้วไม่จำเป็นต้องตรงกันก็ได้ เช่น self.hp = hpสูงสุด ซึ่งตรงนี้คือรับค่า hpสูงสุด มาแต่ถือโอกาสกำหนดค่า hp ตอนเริ่มต้นเป็นค่า hpสูงสุด ไปด้วยผู้เล่น4 นั้น ชื่อ "ยืนยัน" เลเวล 1 พลังโจมตี 5 พลังป้องกัน 6 hpสูงสุด 20ผู้เล่น4.ชื่อ = 'ยืนยัน'
ผู้เล่น4.เลเวล = 1
ผู้เล่น4.พลังโจมตี = 5
ผู้เล่น4.พลังป้องกัน = 6
ผู้เล่น4.hpสูงสุด = 20
ผู้เล่น4.hp = ผู้เล่น4.hpสูงสุด
__init__ ก็แค่ใส่ค่าเป็นอาร์กิวเมนต์ ค่านี้ก็จะถูกนำมาป้อนให้กับแอตทริบิวต์ทันทีclass ผู้กล้า:
def __init__(self,ชื่อ,เลเวล=1,พลังโจมตี=4,พลังป้องกัน=4,hpสูงสุด=10):
self.ชื่อ = ชื่อ
self.เลเวล = เลเวล
self.พลังโจมตี = พลังโจมตี
self.พลังป้องกัน = พลังป้องกัน
self.hpสูงสุด = hpสูงสุด
self.hp = hpสูงสุด
print('ผู้กล้าได้ถือกำเนิดขึ้นแล้ว')
เลเวล, พลังโจมตี, พลังป้องกัน และ hpสูงสุด ถ้าไม่ใส่ก็จะได้ค่าเป็นค่าเป็น 1,4,4,10 ตามลำดับ แต่ถ้าใส่ก็จะได้ค่าตามที่ใส่ผู้เล่น5 = ผู้กล้า(ชื่อ='มั่นคง',พลังโจมตี=7)
ผู้เล่น5 ที่ ชื่อ "มั่นคง" เลเวล 1 พลังโจมตี 7 พลังป้องกัน 4 และ hpสูงสุด 10__init__ แล้วก็ยังมีอีกหลายตัว จะแนะนำเพิ่มเติมในบทที่ ๒๔อาวุธ ขึ้นมา โดยให้เป็นของอย่างหนึ่งที่ ผู้กล้า ถือครองอยู่ อาวุธนั้นมีคุณสมบัติ พลังโจมตีกายภาพ อยู่ ซึ่งจะเป็นตัวกำหนดพลังโจมตีรวมของผู้เล่นพลังโจมตี เป็นแอตทริบิวต์หนึ่งของ ผู้กล้า แต่คราวนี้จะลองเปลี่ยนใหม่โดยให้ พลังโจมตี คำนวณจาก ความแข็งแรง และ พลังโจมตีกายภาพ ของ อาวุธ
class อาวุธ:
def __init__(self,ชื่อ,พลังโจมตีกายภาพ,พลังโจมตีเวทย์,ความทนทาน):
self.ชื่อ = ชื่อ
self.พลังโจมตีกายภาพ = พลังโจมตีกายภาพ
self.พลังโจมตีเวทย์ = พลังโจมตีเวทย์
self.ความทนทาน = ความทนทาน
class ผู้กล้า:
def __init__(self,ชื่อ,เลเวล=1,ความแข็งแรง=4,พลังป้องกัน=4,hpสูงสุด=10):
self.ชื่อ = ชื่อ
self.เลเวล = เลเวล
self.ความแข็งแรง = ความแข็งแรง
self.พลังป้องกัน = พลังป้องกัน
self.hpสูงสุด = hpสูงสุด
self.hp = hpสูงสุด
def พลังโจมตี(self):
return self.ความแข็งแรง + self.อาวุธที่ถือ.พลังโจมตีกายภาพ
# เริ่มการใช้งาน
ผู้เล่น5 = ผู้กล้า('มั่นคง',1,7,6,15)
ดาบ1 = อาวุธ('ดาบเก่าขึ้นสนิม',6,0,10)
ผู้เล่น5.อาวุธที่ถือ = ดาบ1
print(ผู้เล่น5.อาวุธที่ถือ.ชื่อ) # ได้ ดาบเก่าขึ้นสนิม
print(ผู้เล่น5.อาวุธที่ถือ.พลังโจมตีกายภาพ) # ได้ 6
print(ผู้เล่น5.อาวุธที่ถือ.พลังโจมตีเวทย์) # ได้ 0
print(ผู้เล่น5.อาวุธที่ถือ.ความทนทาน) # ได้ 10
print(ผู้เล่น5.พลังโจมตี()) # ได้ 13
ดาบ1 ขึ้นเป็นออบเจ็กต์ในคลาส อาวุธ มีแอตทริบิวต์ ชื่อ, พลังโจมตีกายภาพ, พลังโจมตีเวทย์, ความทนทาน ซึ่งต้องกำหนดค่าตอนที่สร้างออบเจ็กต์ขึ้นผู้เล่น5 ถือ ดาบ1 ด้วยการตั้งให้แอตทริบิวต์ อาวุธที่ถือ ของ ผู้เล่น5 เป็น ดาบ1อาวุธที่ถือ ของ ผู้เล่น5 กลายเป็น ดาบ1 ไปแล้วแบบนี้แอตทริบิวต์ของอาวุธก็กลายเป็นแอตทริบิวต์ของแอตทริบิวต์ เราสามารถเข้าถึงได้ด้วยการใส่จุด . สองต่อดังที่เห็นพลังโจมตี ซึ่งจะคืนค่าพลังโจมตีของผู้เล่นออกมา โดยคำนวณจาก ความแข็งแรง ซึ่งเป็นแอตทริบิวต์ของผู้เล่นเอง บวกกับ พลังโจมตีกายภาพ ของ อาวุธที่ถือ ที่ผู้เล่นถืออยู่พลังโจมตี ในตัวอย่างนี้ต่างจากตัวอย่างที่ผ่านมา คือพลังโจมตีไม่ได้เป็นแอตทริบิวต์แล้วแต่กลายเป็นเมธอด ทำให้ต้องมีวงเล็บเปิดปิด () ต่อท้ายด้วยclass อาวุธ:
def __init__(self,ชื่อ,พลังโจมตีกายภาพ,พลังโจมตีเวทย์,ความทนทาน):
self.ชื่อ = ชื่อ
self.พลังโจมตีกายภาพ = พลังโจมตีกายภาพ
self.พลังโจมตีเวทย์ = พลังโจมตีเวทย์
self.ความทนทาน = ความทนทาน
class เสื้อผ้า:
def __init__(self,ชื่อ,พลังป้องกัน,ความทนทาน):
self.ชื่อ = ชื่อ
self.พลังป้องกัน = พลังป้องกัน
self.ความทนทาน = ความทนทาน
class ผู้กล้า:
def __init__(self,ชื่อ,เลเวล=1,ความแข็งแรง=4,พลังเวทย์=4,ความอดทน=4,hpสูงสุด=10):
self.ชื่อ = ชื่อ
self.เลเวล = เลเวล
self.ความแข็งแรง = ความแข็งแรง
self.พลังเวทย์ = พลังเวทย์
self.ความอดทน = ความอดทน
self.hpสูงสุด = hpสูงสุด
self.hp = hpสูงสุด
def พลังโจมตี(self):
return self.ความแข็งแรง + self.อาวุธที่ถือ.พลังโจมตีกายภาพ
def พลังโจมตีเวทย์(self):
return self.พลังเวทย์ + self.อาวุธที่ถือ.พลังโจมตีเวทย์
def พลังป้องกัน(self):
return self.ความอดทน + self.เสื้อผ้าที่ใส่.พลังป้องกัน
def ถูกโจมตี(self,ความเสียหาย):
if(ความเสียหาย>self.พลังป้องกัน()):
self.hp -= ความเสียหาย - self.พลังป้องกัน()
else:
self.hp -= 1
if(self.hp<0):
self.hp = 0
# เริ่มการใช้งาน
ผู้เล่น6 = ผู้กล้า('กระสัน',1,4,8,6,15)
คฑา1 = อาวุธ('คฑาเก่าผุๆ',1,6,10)
เกราะ1 = เสื้อผ้า('เกราะเก่าผุๆ',4,10)
ผู้เล่น6.อาวุธที่ถือ = คฑา1
ผู้เล่น6.เสื้อผ้าที่ใส่ = เกราะ1
print(ผู้เล่น6.อาวุธที่ถือ.ชื่อ) # ได้ คฑาเก่าผุๆ
print(ผู้เล่น6.เสื้อผ้าที่ใส่.ชื่อ) # ได้ เกราะเก่าผุๆ
print(ผู้เล่น6.พลังโจมตี()) # ได้ 5
print(ผู้เล่น6.พลังโจมตีเวทย์()) # ได้ 14
print(ผู้เล่น6.พลังป้องกัน()) # ได้ 10
เสื้อผ้าที่ใส่ มาเพื่อใช้เป็นตัวคำนวณพลังป้องกัน โดยมีการกำหนดให้ ผู้กล้า มีแอตทริบิวต์ ความอดทน ด้วย พลังป้องกันในที่นี้กำหนดให้เป็นเมธอดที่คำนวณผลรวมของ ความอดทน และ พลังป้องกัน ของเสื้อผ้าพลังโจมตีเวทย์ ซึ่งคำนวณจาก พลังโจมตีเวทย์ ของ อาวุธที่ถือ บวกกับ พลังเวทย์ ของ ผู้กล้าอาวุธกายภาพ กับ อาวุธเวทย์ ก็แล้วแต่ความสะดวก อาจลองทำดูได้ แต่ในที่นี้คิดว่ายังไม่มีความจำเป็นต้องแบ่งถูกโจมตี ไปด้วย โดยเขียนคล้ายกับเมธอดก่อนหน้านี้ ต่างกันแค่ พลังป้องกัน ในที่นี้ใช้เป็นเมธอดแล้วจึงต้องใส่วงเล็บ () ไว้ข้างหลังผู้กล้า ดู เช่นผู้กล้าแต่ละคนก็น่าจะมี เงินเดือน ให้สักหน่อย
class ผู้กล้า:
def __init__(self,ชื่อ,เลเวล=1,ความแข็งแรง=4,ความอดทน=4,hpสูงสุด=10):
self.ชื่อ = ชื่อ
self.เลเวล = เลเวล
self.ความแข็งแรง = ความแข็งแรง
self.ความอดทน = ความอดทน
self.hpสูงสุด = hpสูงสุด
self.hp = hpสูงสุด
เงินเดือน = 500
ผู้กล้า ทุกคนจะมีแอตทริบิวต์ เงินเดือน ซึ่งมีค่า 500ผู้กล้า ทุกคนมี เงินเดือน เป็น 500print(ผู้กล้า.เงินเดือน) # ได้ 500
ผู้เล่น7 = ผู้กล้า('มั่งมี')
print(ผู้เล่น7.เงินเดือน) # ได้ 500
ผู้เล่น8 = ผู้กล้า('เป็นสุข')
print(ผู้เล่น8.เงินเดือน) # ได้ 500
ผู้เล่น7 และ ผู้เล่น8 เป็นอินสแตนซ์ของคลาส ผู้กล้า จึงมีแอตทริบิวต์ เงินเดือน เป็น 500 และตัวคลาส ผู้กล้า เองก็มีแอตทริบิวต์ 500 เช่นกันผู้กล้า ถูกประกาศลดเงินเดือนทั้งหมด
ผู้กล้า.เงินเดือน = 400
print(ผู้เล่น7.เงินเดือน) # ได้ 400
print(ผู้เล่น8.เงินเดือน) # ได้ 400
print(ผู้กล้า.เงินเดือน) # ได้ 400
เงินเดือน ซึ่งเป็นแอตทริบิวต์ของคลาส เงินเดือน ของออบเจ็กต์ในคลาสก็เปลี่ยนตามผู้เล่น7 แอตทริบิวต์ เงินเดือน จะกลายเป็นแอตทริบิวต์ของออบเจ็กต์แทน ค่านั้นจะไม่มีผลต่อแอตทริบิวต์ของคลาสหรือออบเจ็กต์อื่นผู้เล่น7 ทำผลงานดีเลยได้ขึ้นเงินเดือน ลองประกาศเพิ่มเงินเดือนให้กับ ผู้เล่น7 คนเดียว
ผู้เล่น7.เงินเดือน = 3000
print(ผู้เล่น7.เงินเดือน) # ได้ 3000
print(ผู้เล่น8.เงินเดือน) # ได้ 400
print(ผู้กล้า.เงินเดือน) # ได้ 400
เงินเดือน ของ ผู้เล่น7 จึงทำให้เพิ่มอยู่แค่คนเดียว ผิดกับกรณีที่เปลี่ยนค่าให้กับ เงินเดือน ของ ผู้กล้า ซึ่งเป็นการเปลี่ยนค่าแอตทริบิวต์ของคลาส แบบนี้จะถูกเปลี่ยนแปลงทั้งหมดเงินเดือน ของ ผู้กล้า อีกครั้งจะเกิดอะไรขึ้น? ก็จะพบว่า เงินเดือน ของ ผู้เล่น7 ไม่มีการเปลี่ยนแปลงใดๆ แต่ของ ผู้เล่น8 จะยังเปลี่ยนแปลงตามอยู่
ผู้กล้า.เงินเดือน = 600
print(ผู้เล่น7.เงินเดือน) # ได้ 3000
print(ผู้เล่น8.เงินเดือน) # ได้ 600
print(ผู้กล้า.เงินเดือน) # ได้ 600
เงินเดือน ของ ผู้เล่น7 ได้กลายเป็นแอตทริบิวต์ของตัวออบเจ็กต์เองไปแล้ว ไม่ใช่แอตทริบิวต์ของคลาสอีกต่อไป ดังนั้นต่อให้เปลี่ยนค่าแอตทริบิวต์ของคลาสก็จะไม่เปลี่ยนแปลงตามผู้เล่น8 ยังไม่มีการป้อนค่าแอตทริบิวต์ เงินเดือน ให้ ดังนั้นแอตทริบิวต์ เงินเดือน ก็ยังเป็นแอตทริบิวต์ของคลาสอยู่ผู้เล่น9 = ผู้กล้า('พอใจ')
print(ผู้เล่น9.เงินเดือน) # ได้ 600
อาวุธ กับ เสื้อผ้า ให้กับผู้เล่นเริ่มต้น
class อาวุธ:
def __init__(self,ชื่อ,พลังโจมตีกายภาพ,พลังโจมตีเวทย์,ความทนทาน):
self.ชื่อ = ชื่อ
self.พลังโจมตีกายภาพ = พลังโจมตีกายภาพ
self.พลังโจมตีเวทย์ = พลังโจมตีเวทย์
self.ความทนทาน = ความทนทาน
class เสื้อผ้า:
def __init__(self,ชื่อ,พลังป้องกัน,ความทนทาน):
self.ชื่อ = ชื่อ
self.พลังป้องกัน = พลังป้องกัน
self.ความทนทาน = ความทนทาน
class ผู้กล้า:
def __init__(self,ชื่อ,เลเวล=1,ความแข็งแรง=4,ความอดทน=4,hpสูงสุด=10):
self.ชื่อ = ชื่อ
self.เลเวล = เลเวล
self.ความแข็งแรง = ความแข็งแรง
self.ความอดทน = ความอดทน
self.hpสูงสุด = hpสูงสุด
self.hp = hpสูงสุด
อาวุธที่ถือ = อาวุธ('มีดสั้นเก่าๆ',3,0,5)
เสื้อผ้าที่ใส่ = เสื้อผ้า('ชุดเก่าๆ',3,5)
ผู้เล่น10 = ผู้กล้า('มีฤทธิ์')
print(ผู้เล่น10.อาวุธที่ถือ.ชื่อ) # ได้ มีดสั้นเก่าๆ
print(ผู้เล่น10.อาวุธที่ถือ.พลังโจมตีกายภาพ) # ได้ 3
print(ผู้เล่น10.เสื้อผ้าที่ใส่.ชื่อ) # ได้ ชุดเก่าๆ
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ