এই "আন্ডারকোরিং "টি অনেকটা ঘটেছে বলে মনে হচ্ছে এবং আমি ভাবছিলাম যে পাইথন ভাষায় এটির প্রয়োজন ছিল, নাকি নিছক সম্মেলনের বিষয়?
এছাড়াও, কেউ কি নাম লিখিয়ে ব্যাখ্যা করতে পারে যে কোন ফাংশনগুলিতে আন্ডারস্কোর রয়েছে এবং কেন ( __init__
উদাহরণস্বরূপ)?
এই "আন্ডারকোরিং "টি অনেকটা ঘটেছে বলে মনে হচ্ছে এবং আমি ভাবছিলাম যে পাইথন ভাষায় এটির প্রয়োজন ছিল, নাকি নিছক সম্মেলনের বিষয়?
এছাড়াও, কেউ কি নাম লিখিয়ে ব্যাখ্যা করতে পারে যে কোন ফাংশনগুলিতে আন্ডারস্কোর রয়েছে এবং কেন ( __init__
উদাহরণস্বরূপ)?
উত্তর:
থেকে পাইথন কোড স্টাইল নির্দেশিকা - পাইথন PEP 8 :
বর্ণনামূলক: নামকরণ শৈলী
নেতৃস্থানীয় বা অনুসরণযোগ্য আন্ডারস্কোরগুলি ব্যবহার করে নিম্নলিখিত বিশেষ ফর্মগুলি স্বীকৃত (এগুলি সাধারণত কোনও কেস কনভেনশনের সাথে মিলিত হতে পারে):
_single_leading_underscore
: দুর্বল "অভ্যন্তরীণ ব্যবহার" সূচক। উদাহরণস্বরূপfrom M import *
এমন বস্তু আমদানি করে না যার নাম আন্ডারস্কোর দিয়ে শুরু হয়।
single_trailing_underscore_
: পাইথন কীওয়ার্ডের সাথে দ্বন্দ্ব এড়াতে কনভেনশন দ্বারা ব্যবহৃত হয়, যেমন
Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
: যখন কোনও শ্রেণীর বৈশিষ্ট্যটির নামকরণ করা হয়, তখন নাম ম্যাঙ্গিলিংয়ের আবেদন করা হয় (শ্রেণীর ফুবারের ভিতরে,__boo
হয়ে যায়_FooBar__boo
; নীচে দেখুন)।
__double_leading_and_trailing_underscore__
: "যাদু" অবজেক্ট বা বৈশিষ্ট্য যা ব্যবহারকারী নিয়ন্ত্রিত নেমস্পেসে থাকে। যেমন__init__
,__import__
বা__file__
। এ জাতীয় নাম কখনও উদ্ভাবন করবেন না; এগুলি কেবল নথিভুক্ত হিসাবে ব্যবহার করুন।
নোট করুন যে ডাবল লিডিং এবং ট্রেলিং আন্ডারস্কোর সহ নামগুলি পাইথনের জন্য মূলত সংরক্ষিত রয়েছে: "এই জাতীয় নাম কখনই উদ্ভাবন করবেন না; কেবল তাদের ডকুমেন্টেড হিসাবে ব্যবহার করুন"।
__double_leading_underscore
হয় এখনো প্রকাশ্য পরিবর্তনশীল কেবল সংঘর্ষ এড়াতে নতুন নামকরণ করা হয়।
অন্যান্য উত্তরদাতারা "বিশেষ" বা "যাদু" পদ্ধতিগুলির নামকরণের সম্মেলন হিসাবে ডাবল নেতৃস্থানীয় এবং অনুসরণের আন্ডারস্কোরগুলি বর্ণনা করার ক্ষেত্রে সঠিক।
আপনি যখন এই পদ্ধতিগুলি সরাসরি কল করতে পারেন ( [10, 20].__len__()
উদাহরণস্বরূপ), আন্ডারস্কোরগুলির উপস্থিতি একটি ইঙ্গিত যা এই পদ্ধতিগুলি পরোক্ষভাবে ( len([10, 20])
উদাহরণস্বরূপ) আহ্বান করার উদ্দেশ্যে করা হয় । বেশিরভাগ পাইথন অপারেটরগুলির একটি সম্পর্কিত "ম্যাজিক" পদ্ধতি রয়েছে (উদাহরণস্বরূপ, a[x]
প্রার্থনা করার স্বাভাবিক উপায় a.__getitem__(x)
)।
ডাবল আন্ডারস্কোর দ্বারা বেষ্টিত নামগুলি পাইথনের কাছে "বিশেষ"। সেগুলিকে পাইথন ল্যাঙ্গুয়েজ রেফারেন্স, বিভাগ 3, "ডেটা মডেল" এ তালিকাভুক্ত করা হয়েছে ।
প্রকৃতপক্ষে যখন আমি পিতা বা মাতা এবং শিশু শ্রেণির নামের মধ্যে পার্থক্য করতে পারি তখন _ পদ্ধতির নামগুলি ব্যবহার করি। আমি এমন কিছু কোড পড়েছি যা পিতামাতাদের ও শিশুদের ক্লাস তৈরির এই পদ্ধতি ব্যবহার করে। উদাহরণ হিসাবে আমি এই কোডটি সরবরাহ করতে পারি:
class ThreadableMixin:
def start_worker(self):
threading.Thread(target=self.worker).start()
def worker(self):
try:
self._worker()
except tornado.web.HTTPError, e:
self.set_status(e.status_code)
except:
logging.error("_worker problem", exc_info=True)
self.set_status(500)
tornado.ioloop.IOLoop.instance().add_callback(self.async_callback(self.results))
...
এবং যে শিশুটির একটি _ কর্মী পদ্ধতি রয়েছে
class Handler(tornado.web.RequestHandler, ThreadableMixin):
def _worker(self):
self.res = self.render_string("template.html",
title = _("Title"),
data = self.application.db.query("select ... where object_id=%s", self.object_id)
)
...
এই কনভেনশনটি বিশেষ ভেরিয়েবল বা পদ্ধতিগুলির জন্য ব্যবহৃত হয় (তথাকথিত "যাদু পদ্ধতি") যেমন __init__
এবং __len__
। এই পদ্ধতিগুলি বিশেষ সিনট্যাকটিক বৈশিষ্ট্য সরবরাহ করে বা বিশেষ কিছু করে।
উদাহরণস্বরূপ, __file__
পাইথন ফাইলের অবস্থান নির্দেশ করে, এক্সপ্রেশন __eq__
কার্যকর হলে a == b
মৃত্যুদন্ড কার্যকর করা হয়।
অবশ্যই একজন ব্যবহারকারী একটি কাস্টম বিশেষ পদ্ধতি তৈরি করতে পারেন, এটি খুব বিরল ঘটনা, তবে প্রায়শই বিল্ট-ইন বিশেষ পদ্ধতিগুলির মধ্যে কিছু পরিবর্তন করতে পারে (যেমন আপনার ক্লাসের সূচনা করা উচিত __init__
প্রথমে যখন ক্লাসের উদাহরণ ঘটে তখন কার্যকর করা হবে) সৃষ্ট).
class A:
def __init__(self, a): # use special method '__init__' for initializing
self.a = a
def __custom__(self): # custom special method. you might almost do not use it
pass
অজগরটিতে __ এর ব্যবহার বোঝার জন্য একটি উদাহরণ যুক্ত করা হয়েছে। এখানে সমস্ত তালিকা __
https://docs.python.org/3/genindex-all.html#_
নির্দিষ্ট শ্রেণীর শনাক্তকারীদের (কীওয়ার্ড ছাড়াও) বিশেষ অর্থ রয়েছে। কোন ব্যবহার * নাম, অন্য কোন প্রেক্ষাপটে, যে বিষদ বিবরণ ব্যবহার অনুসরণ না সতর্কবাণী ছাড়াই বিচ্ছেদ সাপেক্ষে
__ ব্যবহার করে অ্যাক্সেস সীমাবদ্ধতা
"""
Identifiers:
- Contain only (A-z, 0-9, and _ )
- Start with a lowercase letter or _.
- Single leading _ : private
- Double leading __ : strong private
- Start & End __ : Language defined Special Name of Object/ Method
- Class names start with an uppercase letter.
-
"""
class BankAccount(object):
def __init__(self, name, money, password):
self.name = name # Public
self._money = money # Private : Package Level
self.__password = password # Super Private
def earn_money(self, amount):
self._money += amount
print("Salary Received: ", amount, " Updated Balance is: ", self._money)
def withdraw_money(self, amount):
self._money -= amount
print("Money Withdraw: ", amount, " Updated Balance is: ", self._money)
def show_balance(self):
print(" Current Balance is: ", self._money)
account = BankAccount("Hitesh", 1000, "PWD") # Object Initalization
# Method Call
account.earn_money(100)
# Show Balance
print(account.show_balance())
print("PUBLIC ACCESS:", account.name) # Public Access
# account._money is accessible because it is only hidden by convention
print("PROTECTED ACCESS:", account._money) # Protected Access
# account.__password will throw error but account._BankAccount__password will not
# because __password is super private
print("PRIVATE ACCESS:", account._BankAccount__password)
# Method Call
account.withdraw_money(200)
# Show Balance
print(account.show_balance())
# account._money is accessible because it is only hidden by convention
print(account._money) # Protected Access