যদিও এর আগে কখনও আমার প্রয়োজন হয় নি, এটি কেবল আমাকে আঘাত করেছিল যে পাইথনে একটি অপরিবর্তনীয় বস্তু তৈরি করা কিছুটা জটিল হতে পারে। আপনি কেবল ওভাররাইড করতে পারবেন না __setattr__
, কারণ এরপরে আপনি এমনকি বৈশিষ্ট্যগুলিও সেট করতে পারবেন না __init__
। একটি টিউপল সাবক্ল্যাসিং একটি কৌশল যা কাজ করে:
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]
যা বিরক্তিকর।
খাঁটি পাইথনে এটি কি সম্ভব? যদি তা না হয় তবে আমি কীভাবে এটি সি এক্সটেনশন দিয়ে করব?
(যে উত্তরগুলি কেবল পাইথন 3 এ কাজ করে সেগুলি গ্রহণযোগ্য)।
হালনাগাদ:
সুতরাং subclassing tuple পথ বিশুদ্ধ পাইথন, যা ভাল দ্বারা তথ্য অ্যাক্সেস অতিরিক্ত সম্ভাবনা ছাড়া কাজ করে এটা করতে হয় [0]
, [1]
ইত্যাদি সুতরাং, এই প্রশ্ন যে সব হারিয়েছে হাওটুর এটি "সঠিকভাবে" সি, না হয় সম্পূর্ণ করার জন্য যা আমি সন্দেহ করি যে কোনও সরল geititem
বা setattribute
ইত্যাদি বাস্তবায়ন না করে এটি বেশ সহজ হবে তবে আমি নিজে এটি না করে আমি তার জন্য অনুদানের প্রস্তাব দিই, কারণ আমি অলস। :)
NotImplemented
কেবল সমৃদ্ধ তুলনাগুলির জন্য একটি ফিরতি মান হিসাবে বোঝানো হয়েছে। এর জন্য কোনও রিটার্ন মান __setatt__()
হ'ল বরং অর্থহীন, যেহেতু আপনি সাধারণত এটি মোটেও দেখতে পাবেন না। কোডটি immutable.x = 42
নীরবে কিছুই করবে না। TypeError
পরিবর্তে আপনার উত্থাপন করা উচিত ।
NotImplementedError
, কিন্তু TypeError
কি একটি tuple উত্থাপন যদি আপনি এটি পরিবর্তন করতে চেষ্টা করুন।
.a
এবং এর মাধ্যমে বৈশিষ্ট্যগুলিতে অ্যাক্সেসের সুবিধা দেয় না.b
? বৈশিষ্ট্যগুলি সমস্ত কিছুর জন্য বিদ্যমান বলে মনে হয়।