সমস্যা
আমি পাইথন প্রকল্পে কাজ করছি যার মূল শ্রেণিটি কিছুটা " গড অবজেক্ট "। আছে তাই friggin 'অনেকগুলো চারিত্রিক বৈশিষ্ট্য ও পদ্ধতি!
আমি ক্লাস রিফ্যাক্টর করতে চাই।
যতদূর…
প্রথম পদক্ষেপের জন্য, আমি তুলনামূলক সহজ কিছু করতে চাই; তবে যখন আমি সবচেয়ে সহজ পদ্ধতির চেষ্টা করেছি তখন এটি কিছু পরীক্ষা এবং বিদ্যমান উদাহরণগুলিকে ভেঙে দিয়েছে।
মূলত, শ্রেণীর গুণাবলীর একটি দীর্ঘ তালিকা রয়েছে — তবে আমি তাদের পরিষ্কারভাবে দেখতে পারি এবং ভাবতে পারি, "এই 5 টি বৈশিষ্ট্য সম্পর্কিত related এই 8 টিও সম্পর্কিত… এবং এরপরেও বাকি রয়েছে” "
getattr
আমি মূলত কেবলমাত্র সম্পর্কিত বৈশিষ্ট্যগুলিকে একটি ডিকের মতো সহায়ক শ্রেণিতে গ্রুপ করতে চেয়েছিলাম। আমি একটি অনুভূতি ছিল __getattr__
কাজের জন্য আদর্শ হতে হবে। সুতরাং আমি বৈশিষ্ট্যগুলিকে একটি পৃথক শ্রেণিতে স্থানান্তরিত করেছি এবং নিশ্চিতভাবেই, __getattr__
এর যাদুটি পুরোপুরি ভালভাবে কাজ করেছে ...
এ প্রথম ।
কিন্তু তারপরে আমি উদাহরণগুলির মধ্যে একটি চালানোর চেষ্টা করেছি। উদাহরণ সাবক্লাস সরাসরি ( শ্রেণি পর্যায়ে ) এর মধ্যে একটি বৈশিষ্ট্য সেট করার চেষ্টা করে । তবে যেহেতু বৈশিষ্ট্যটি প্যারেন্ট ক্লাসে আর "শারীরিকভাবে" অবস্থান করে না, তাই বৈশিষ্ট্যটির অস্তিত্ব নেই বলে আমি ত্রুটি পেয়েছি।
@property
আমি তখন @property
শোভাকর সম্পর্কে পড়েছি । তবে আমি আরও পড়লাম যে এটি সাবক্লাসগুলির জন্য সমস্যা তৈরি করে যা self.x = blah
যখন x
পিতৃত শ্রেণীর সম্পত্তি হয় তখন করতে চায় ।
আকাঙ্ক্ষিত
- সমস্ত ক্লায়েন্ট কোড ব্যবহার করে কাজ চালিয়ে যান
self.whatever
, এমনকি পিতামাতারwhatever
সম্পত্তি ক্লাসে (বা উদাহরণ) নিজেই "শারীরিকভাবে অবস্থিত" না থাকলেও। - গোষ্ঠী সম্পর্কিত গুণাবলী ডিকের মতো পাত্রে ভাগ করুন।
- মূল শ্রেণিতে কোডের চরম কোলাহলকে হ্রাস করুন।
উদাহরণস্বরূপ, আমি কেবল এটি পরিবর্তন করতে চাই না :
larry = 2
curly = 'abcd'
moe = self.doh()
এটিতে:
larry = something_else('larry')
curly = something_else('curly')
moe = yet_another_thing.moe()
… কারণ এখনও শোরগোল। যদিও এটি সাফল্যের সাথে এমন কিছুতে একটি সহজ বৈশিষ্ট্য তৈরি করে যা ডেটা পরিচালনা করতে পারে, মূলটিতে 3 টি ভেরিয়েবল ছিল এবং টুইড সংস্করণে এখনও 3 ভেরিয়েবল রয়েছে।
যাইহোক, আমি এই জাতীয় কিছু সঙ্গে ভাল হবে:
stooges = Stooges()
এবং যদি কোনও self.larry
ব্যর্থতার জন্য অনুসন্ধান ব্যর্থ হয় তবে কিছু পরীক্ষা করে stooges
দেখতে হবে larry
যে সেখানে আছে কিনা । (তবে একটি সাবক্লাস larry = 'blah'
ক্লাস পর্যায়ে করার চেষ্টা করলে এটি অবশ্যই কার্যকর হবে ))
সারসংক্ষেপ
- প্যারেন্ট ক্লাসে বৈশিষ্ট্যের সম্পর্কিত গোষ্ঠীগুলিকে একক অ্যাট্রিবিউটের সাথে প্রতিস্থাপন করতে চান যা সমস্ত ডেটা অন্য কোথাও সঞ্চয় করে
larry = 'blah'
ক্লাস স্তরে (যেমন) ব্যবহার করে এমন ক্লায়েন্ট কোডগুলির সাথে কাজ করতে চান- সাব-ক্লাসগুলি কিছু না জেনেও এই রিফ্যাক্টরযুক্ত বৈশিষ্ট্যগুলি প্রসারিত, ওভাররাইড এবং সংশোধন করার অনুমতি অবিরত রাখতে চান
এটা কি সম্ভব? নাকি আমি ভুল গাছটি ছাঁটাই করছি?