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
ตามด้วยชื่อเมธอด แล้วก็วงเล็บซึ่งภายในวงเล็บมีพารามิเตอร์อยู่self
self
ก็ให้ผลเหมือนกัน เช่นลองเขียนใหม่เป็น
class ผู้กล้า:
def ถูกโจมตี(ตัวเอง,ความเสียหาย):
ตัวเอง.hp -= ความเสียหาย - ตัวเอง.พลังป้องกัน
self
ด้วย จะไม่มีการใช้คำอื่นแทนผู้เล่น3.ถูกโจมตี(40)
ความเสียหาย
ซึ่งเป็นพารามิเตอร์ตัวที่สองself
นั้นจะแทนตัวออบเจ็กต์ที่ถูกเรียกใช้เมธอด ซึ่งในที่นี้ก็คือ ผู้เล่น3
self.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.เสื้อผ้าที่ใส่.ชื่อ) # ได้ ชุดเก่าๆ
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ