ฉันสงสัยว่าจะเป็นไปได้หรือไม่ที่จะหลีกเลี่ยงข้อเสียบางประการของการใช้ตัวแปรส่วนกลาง (ดูเช่นhttp://wiki.c2.com/?GlobalVariablesAreBad ) โดยใช้เนมสเปซคลาสแทนเนมสเปซส่วนกลาง / โมดูลเพื่อส่งผ่านค่าของตัวแปร . รหัสต่อไปนี้ระบุว่าทั้งสองวิธีนั้นเหมือนกันเป็นหลัก มีข้อได้เปรียบเล็กน้อยในการใช้เนมสเปซคลาสตามที่อธิบายไว้ด้านล่าง
โค้ดแฟรกเมนต์ต่อไปนี้ยังแสดงว่าแอ็ตทริบิวต์หรือตัวแปรอาจถูกสร้างและลบแบบไดนามิกทั้งในเนมสเปซส่วนกลาง / โมดูลและเนมสเปซคลาส
wall.py
# Note no definition of global variables
class router:
""" Empty class """
ฉันเรียกโมดูลนี้ว่า 'กำแพง' เนื่องจากใช้ในการเด้งตัวแปรออกจาก มันจะทำหน้าที่เป็นช่องว่างสำหรับกำหนดตัวแปรส่วนกลางชั่วคราวและแอตทริบิวต์ระดับกว้างของคลาสว่าง 'เราเตอร์'
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
โมดูลนี้นำเข้าวอลล์และกำหนดฟังก์ชันเดียวsourcefn
ซึ่งกำหนดข้อความและปล่อยออกมาโดยกลไกที่แตกต่างกันสองกลไกหนึ่งผ่านทาง globals และอีกหนึ่งฟังก์ชันผ่านทางฟังก์ชันเราเตอร์ โปรดสังเกตว่าตัวแปรwall.msg
และwall.router.message
กำหนดไว้ที่นี่เป็นครั้งแรกในเนมสเปซที่เกี่ยวข้อง
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
โมดูลนี้กำหนดฟังก์ชันdestfn
ที่ใช้กลไกที่แตกต่างกันสองแบบเพื่อรับข้อความที่ส่งมาจากแหล่งที่มา ช่วยให้มีความเป็นไปได้ที่ตัวแปร 'msg' อาจไม่มีอยู่จริง destfn
ยังลบตัวแปรเมื่อแสดงแล้ว
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
โมดูลนี้เรียกฟังก์ชันที่กำหนดไว้ก่อนหน้านี้ตามลำดับ หลังจากการเรียกครั้งแรกไปdest.destfn
ยังตัวแปรwall.msg
และwall.router.msg
ไม่มีอยู่อีกต่อไป
ผลลัพธ์จากโปรแกรมคือ:
global: สวัสดีชาวโลก - - '
เราเตอร์: สวัสดีชาวโลก - - '
ส่วนกลาง: ไม่มี
เราเตอร์ข้อความ: ไม่มีข้อความ
ส่วนโค้ดข้างต้นแสดงให้เห็นว่ากลไกตัวแปรโมดูล / global และ class / class นั้นเหมือนกัน
หากต้องใช้ตัวแปรร่วมกันจำนวนมากมลพิษเนมสเปซสามารถจัดการได้โดยใช้โมดูลประเภทผนังหลายโมดูลเช่น wall1, wall2 เป็นต้นหรือโดยการกำหนดคลาสประเภทเราเตอร์หลายประเภทในไฟล์เดียว ข้อหลังเป็นระเบียบกว่าเล็กน้อยดังนั้นอาจแสดงถึงข้อได้เปรียบเล็กน้อยสำหรับการใช้กลไกคลาสตัวแปร