Python เป็นภาษา Object-Oriented เกือบทุกอย่างเป็นออบเจ็กต์มีพร็อพเพอร์ตี้และเมธอด Class เป็นแบบแผนสร้างออบเจ็กต์
ตัวแปรที่นิยาม นอกคลาส สามารถเข้าถึงได้จากคลาสหรือเมธอดใดๆ ในคลาสโดยแค่เขียนชื่อตัวแปร
ตัวอย่างโค้ด
1. ตัวแปรนอกคลาส (Global/Module Level)
# ตัวแปรนิยามนอกคลาส
outVar = 'outside_class'
print("Outside_class1", outVar)
class Ctest:
print("Outside_class2", outVar)
def access_method(self):
print("Outside_class3", outVar)
# เรียกใช้
uac = Ctest()
uac.access_method()
class Another_Ctest_class:
print("Outside_class4", outVar)
def another_access_method(self):
print("Outside_class5", outVar)
uaac = Another_Ctest_class()
uaac.another_access_method()
2. ตัวแปรในเมธอด (Local Variable)
class Ctest:
def access_method(self):
# ตัวแปรในเมธอด
inVar = 'inside_method'
print("Inside_method3", inVar)
uac = Ctest()
uac.access_method()
class AnotherCtest:
def access_method(self):
pass
uaac = AnotherCtest()
uaac.access_method()
ขอบเขตตัวแปร (Variable Scope) สรุป
| ประเภท | ขอบเขต | เข้าถึงได้จาก |
|---|---|---|
| Global/Module variable | โมดูลทั้งหมด | ทุกคลาส ทุกฟังก์ชัน ในโมดูลเดียวกัน |
| Class variable | ภายในคลาส | ทุกอินสแตนซ์และเมธอดของคลาส (ผ่าน ClassName.var หรือ self.var) |
| Instance variable | อินสแตนซ์เฉพาะตัว | เฉพาะอินสแตนซ์นั้นๆ (self.var) |
| Local variable | ภายในฟังก์ชัน/เมธอด | เฉพาะในฟังก์ชัน/เมธอดนั้นๆ |
ตัวอย่างครบถ้วน
# Global variable
GLOBAL_VAR = "I'm global"
class MyClass:
# Class variable
CLASS_VAR = "I'm class variable"
def __init__(self, value):
# Instance variable
self.instance_var = value
def method(self):
# Local variable
local_var = "I'm local"
print(GLOBAL_VAR) # เข้าถึง global ได้
print(self.CLASS_VAR) # เข้าถึง class variable ได้
print(self.instance_var) # เข้าถึง instance variable ได้
print(local_var) # เข้าถึง local ได้
# print(undefined_var) # Error!
obj = MyClass("instance value")
obj.method()
# เข้าถึงจากนอก
print(MyClass.CLASS_VAR) # ผ่านคลาส
print(obj.instance_var) # ผ่านอินสแตนซ์
# print(obj.local_var) # Error! ไม่เข้าถึง local ได้
แนวทางปฏิบัติที่ดี
- หลีกเลี่ยง global variables มากเกินไป - ทำให้โค้ดยากต่อการทดสอบและ debug
- ใช้ class variables สำหรับค่าที่แบ่งปันระหว่างอินสแตนซ์ทั้งหมด
- ใช้ instance variables สำหรับข้อมูลเฉพาะอินสแตนซ์
- จำกัดขอบเขตตัวแปรให้แคบที่สุดเท่าที่จะเป็นไปได้