แม้ว่าฉันไม่เคยต้องการสิ่งนี้ แต่ก็ทำให้ฉันรู้สึกว่าการสร้างวัตถุที่ไม่เปลี่ยนรูปใน Python อาจเป็นเรื่องยุ่งยากเล็กน้อย คุณไม่สามารถลบล้าง__setattr__
ได้เนื่องจากคุณไม่สามารถกำหนดแอตทริบิวต์ในไฟล์__init__
. Subclassing tuple เป็นเคล็ดลับที่ใช้ได้ผล:
class Immutable(tuple):
def __new__(cls, a, b):
return tuple.__new__(cls, (a, b))
@property
def a(self):
return self[0]
@property
def b(self):
return self[1]
def __str__(self):
return "<Immutable {0}, {1}>".format(self.a, self.b)
def __setattr__(self, *ignored):
raise NotImplementedError
def __delattr__(self, *ignored):
raise NotImplementedError
แต่แล้วคุณมีการเข้าถึงa
และb
ตัวแปรผ่านself[0]
และself[1]
ซึ่งเป็นที่น่ารำคาญ
เป็นไปได้ไหมใน Pure Python ถ้าไม่ฉันจะใช้นามสกุล C ได้อย่างไร?
(คำตอบที่ใช้ได้เฉพาะใน Python 3 เท่านั้นที่ยอมรับได้)
อัปเดต:
ดังนั้น subclassing tuple เป็นวิธีที่จะทำมันในเพียวหลามซึ่งทำงานได้ดียกเว้นสำหรับความเป็นไปได้ที่เพิ่มขึ้นของการเข้าถึงข้อมูลโดย[0]
, [1]
ฯลฯ ดังนั้นเพื่อให้คำถามนี้เป็นสิ่งที่ขาดหายไปคือ HOWTO ทำมัน "อย่างถูกต้อง" ใน C ซึ่ง ฉันสงสัยว่ามันจะค่อนข้างง่ายเพียงแค่ไม่ใช้geititem
หรือsetattribute
อื่น ๆ แต่แทนที่จะทำด้วยตัวเองฉันเสนอเงินรางวัลสำหรับสิ่งนั้นเพราะฉันขี้เกียจ :)
.a
และ.b
? นั่นคือสิ่งที่คุณสมบัติดูเหมือนจะมีอยู่จริง