แม้ว่าฉันไม่เคยต้องการสิ่งนี้ แต่ก็ทำให้ฉันรู้สึกว่าการสร้างวัตถุที่ไม่เปลี่ยนรูปใน 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? นั่นคือสิ่งที่คุณสมบัติดูเหมือนจะมีอยู่จริง