সন্দেহ হলে এটিকে "সর্বজনীন" ছেড়ে দিন - মানে, আপনার গুণাবলীর নামটি অস্পষ্ট করতে কোনও কিছু যুক্ত করবেন না। আপনার যদি কিছু অভ্যন্তরীণ মান সহ কোনও শ্রেণি থাকে তবে এটি নিয়ে মাথা ঘামান না। লেখার পরিবর্তে:
class Stack(object):
def __init__(self):
self.__storage = [] # Too uptight
def push(self, value):
self.__storage.append(value)
এটি ডিফল্টরূপে লিখুন:
class Stack(object):
def __init__(self):
self.storage = [] # No mangling
def push(self, value):
self.storage.append(value)
এটি নিশ্চিতভাবেই কাজগুলি করার একটি বিতর্কিত উপায়। পাইথন নবজাতকরা কেবল এটি ঘৃণা করে এমনকি কিছু পুরানো পাইথন ছেলেরাও এই ডিফল্টটিকে ঘৃণা করে - তবে এটি যে কোনও উপায়েই ডিফল্ট, সুতরাং আপনি অস্বস্তি বোধ করলেও আমি সত্যিই আপনাকে এটি অনুসরণ করার পরামর্শ দিচ্ছি।
আপনি যদি সত্যই বার্তাটি প্রেরণ করতে চান তবে "এটি স্পর্শ করতে পারছি না!" আপনার ব্যবহারকারীদের কাছে, সাধারণ উপায়টি হ'ল একটি আন্ডারস্কোর সহ ভেরিয়েবলের আগে । এটি কেবল একটি সম্মেলন, তবে লোকেরা এটি বুঝতে পারে এবং এই জাতীয় জিনিসগুলির সাথে লেনদেন করার সময় দ্বিগুণ যত্ন নেয়:
class Stack(object):
def __init__(self):
self._storage = [] # This is ok but pythonistas use it to be relaxed about it
def push(self, value):
self._storage.append(value)
সম্পত্তির নাম এবং গুণবাচক নামের মধ্যে দ্বন্দ্ব এড়ানোর জন্য এটিও কার্যকর হতে পারে:
class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age if age >= 0 else 0
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
self._age = 0
ডাবল আন্ডারস্কোর সম্পর্কে কী? ঠিক আছে, ডাবল আন্ডারস্কোর যাদুটি প্রধানত ব্যবহৃত হয় দুর্ঘটনাজনিত অতিরিক্ত চাপ পড়তে এবং সুপারক্লাসের বৈশিষ্ট্যগুলির সাথে নাম দ্বন্দ্ব এড়াতে । আপনি যদি এমন একটি ক্লাস লিখেন যা অনেকবার বাড়ানো প্রত্যাশিত হয় তবে এটি বেশ কার্যকর হতে পারে।
আপনি যদি এটি অন্য উদ্দেশ্যে ব্যবহার করতে চান তবে আপনি এটি করতে পারেন তবে এটি স্বাভাবিক বা সুপারিশকৃত নয়।
সম্পাদনা : এমনটি কেন? ঠিক আছে, সাধারণ পাইথন শৈলী জিনিসগুলিকে ব্যক্তিগত করার উপর জোর দেয় না - বিপরীতে! এর অনেকগুলি কারণ রয়েছে - তাদের মধ্যে বেশিরভাগই বিতর্কিত ... আসুন আমরা তাদের কয়েকটি দেখে আসি।
পাইথনের বৈশিষ্ট্য রয়েছে
বেশিরভাগ ওও ভাষাগুলি আজ বিপরীত পদ্ধতির ব্যবহার করে: যা ব্যবহার করা উচিত নয় তা দৃশ্যমান হওয়া উচিত নয়, তাই বৈশিষ্ট্যগুলি ব্যক্তিগত হওয়া উচিত। তাত্ত্বিকভাবে, এটি আরও পরিচালনাযোগ্য, কম সংযুক্ত ক্লাস অর্জন করবে, কারণ কেউই বেপরোয়াভাবে বস্তুর অভ্যন্তরের মান পরিবর্তন করতে পারে না।
তবে এটি এত সহজ নয় simple উদাহরণস্বরূপ, জাভা ক্লাস অনেক বৈশিষ্ট্যাবলী আছে এবং getters যে শুধু পেতে মান এবং setters যে শুধু সেট মান। আপনার প্রয়োজন, আমাদের বলুন, একটি একক বৈশিষ্ট্য ঘোষণার জন্য কোডের সাতটি লাইন - যা পাইথন প্রোগ্রামার বলবে অযথা জটিল। এছাড়াও, অনুশীলনে, আপনি কেবলমাত্র একটি সর্বজনীন ক্ষেত্র পেতে এই পুরো কোডটি লিখেছেন, যেহেতু আপনি গেটার এবং সেটটারগুলি ব্যবহার করে এর মান পরিবর্তন করতে পারেন।
তাহলে এই ব্যক্তিগত-বাই-ডিফল্ট নীতিটি অনুসরণ করবেন কেন? কেবলমাত্র আপনার বৈশিষ্ট্যগুলি ডিফল্টরূপে সর্বজনীন করুন। অবশ্যই এটি জাভাতে সমস্যাযুক্ত কারণ আপনি যদি নিজের বৈশিষ্ট্যের সাথে কিছু বৈধতা যুক্ত করার সিদ্ধান্ত নেন তবে এটির জন্য আপনাকে সমস্ত পরিবর্তন করতে হবে
person.age = age;
আপনার কোডটিতে, আমাদের বলতে দিন,
person.setAge(age);
setAge()
হচ্ছে:
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
this.age = 0;
}
}
সুতরাং জাভাতে (এবং অন্যান্য ভাষাগুলি), ডিফল্টটি হ'ল যাইহোক getters এবং সেটার ব্যবহার করা, কারণ তারা লিখতে বিরক্ত করতে পারে তবে আমি বর্ণিত পরিস্থিতিতে যদি আপনি নিজেকে খুঁজে পান তবে আপনাকে অনেক সময় রক্ষা করতে পারে।
যাইহোক, পাইথনে আপনার এটি করার দরকার নেই, যেহেতু পাইথনের বৈশিষ্ট্য রয়েছে। আপনার যদি এই ক্লাস থাকে:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
এবং তারপরে আপনি বয়সগুলি যাচাই করার সিদ্ধান্ত নেন person.age = age
, আপনার কোডের টুকরো পরিবর্তন করার দরকার নেই । কেবল একটি সম্পত্তি যুক্ত করুন (নীচে দেখানো হয়েছে)
class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age if age >= 0 else 0
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
self._age = 0
আপনি যদি এটি করতে পারেন এবং এখনও ব্যবহার করতে পারেন person.age = age
করতে পারেন তবে আপনি ব্যক্তিগত ক্ষেত্র এবং গিটারগুলি এবং সেটটারগুলি যুক্ত করবেন কেন?
(এছাড়াও, দেখুন পাইথন জাভা নয় এবং এই নিবন্ধটি গেটার এবং সেটারগুলি ব্যবহারের ক্ষতির বিষয়ে ।)
যাইহোক সবকিছু দৃশ্যমান - এবং লুকানোর চেষ্টা আপনার কাজকে জটিল করে তোলে
এমনকি এমন ভাষাগুলিতে যেখানে ব্যক্তিগত বৈশিষ্ট্য রয়েছে, আপনি সেগুলি একরকম প্রতিবিম্ব / আত্মমোচন লাইব্রেরির মাধ্যমে অ্যাক্সেস করতে পারেন। এবং ফ্রেমওয়ার্কে এবং জরুরি প্রয়োজনগুলি সমাধান করার জন্য লোকেরা এটি অনেক কিছু করে। সমস্যাটি হ'ল আত্মনিয়োগের লাইব্রেরিগুলি জনসাধারণের বৈশিষ্ট্যগুলির সাথে আপনি কী করতে পারেন তা করার একটি শক্ত উপায়।
পাইথন যেহেতু খুব গতিশীল ভাষা, তাই এই ভারটিকে আপনার ক্লাসে যুক্ত করা কেবল প্রতি-উত্পাদক।
সমস্যাটি দেখা সম্ভব হচ্ছে না - এটি প্রয়োজন required দেখার
পাইথনিস্টার জন্য, এনক্যাপসুলেশন ক্লাসের ইন্টার্নালগুলি দেখার অক্ষমতা নয়, তবে এটির দিকে তাকানো এড়ানো সম্ভাবনা। আমার অর্থ হ'ল, এনক্যাপসুলেশন হ'ল একটি উপাদানটির সম্পত্তি যা এটি ব্যবহারকারীর অভ্যন্তরীণ বিবরণ সম্পর্কে উদ্বিগ্ন না হয়ে ব্যবহার করার অনুমতি দেয়। আপনি যদি কোনও উপাদান এর প্রয়োগ সম্পর্কে নিজেকে বিরক্ত না করে ব্যবহার করতে পারেন তবে তা আবদ্ধ হয় (পাইথন প্রোগ্রামারের মতে) of
এখন, আপনি যদি নিজের ক্লাসটি এমনভাবে লিখে থাকেন তবে আপনি প্রয়োগের বিশদ সম্পর্কে চিন্তা না করেই এটি ব্যবহার করতে পারেন, আপনি চাইলে কোনও সমস্যা নেই কোনও কারণে ক্লাসের ভিতরে । কথাটি হ'ল: আপনার এপিআই ভাল হওয়া উচিত এবং বাকিটি বিশদ।
গুডো তাই বলেছিল
ঠিক আছে, এটি বিতর্কিত নয়: তিনি আসলে তাই বলেছিলেন । ("উন্মুক্ত কিমোনো।" দেখুন)
এটাই সংস্কৃতি
হ্যাঁ, এর কয়েকটি কারণ রয়েছে, তবে কোনও সমালোচনামূলক কারণ নেই। এটি বেশিরভাগই পাইথনে প্রোগ্রামিংয়ের একটি সাংস্কৃতিক দিক। সত্যই, এটি অন্য উপায়েও হতে পারে - তবে তা নয়। এছাড়াও, আপনি প্রায় সহজেই অন্যভাবে জিজ্ঞাসা করতে পারেন: কিছু ভাষা কেন ডিফল্টরূপে ব্যক্তিগত বৈশিষ্ট্যগুলি ব্যবহার করে? পাইথন অনুশীলনের মতো একই প্রধান কারণ: কারণ এটি এই ভাষার সংস্কৃতি এবং প্রতিটি পছন্দের সুবিধা এবং অসুবিধা রয়েছে।
যেহেতু এই সংস্কৃতিটি ইতিমধ্যে রয়েছে তাই আপনাকে এটি অনুসরণ করার জন্য ভাল পরামর্শ দেওয়া হচ্ছে। অন্যথায়, আপনি __
স্ট্যাক ওভারফ্লোতে কোনও প্রশ্ন জিজ্ঞাসা করার সময় পাইথন প্রোগ্রামাররা আপনাকে কোড থেকে অপসারণ করতে বলে বিরক্ত হয়ে পড়বেন :)