Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python - การใช้ตัวแปรกลางในและนอก Class/Method

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 สำหรับข้อมูลเฉพาะอินสแตนซ์
  • จำกัดขอบเขตตัวแปรให้แคบที่สุดเท่าที่จะเป็นไปได้