কিছু ফাংশনটির ফাংশনটির আগে এবং পরে আন্ডারস্কোর থাকে কেন?


424

এই "আন্ডারকোরিং "টি অনেকটা ঘটেছে বলে মনে হচ্ছে এবং আমি ভাবছিলাম যে পাইথন ভাষায় এটির প্রয়োজন ছিল, নাকি নিছক সম্মেলনের বিষয়?

এছাড়াও, কেউ কি নাম লিখিয়ে ব্যাখ্যা করতে পারে যে কোন ফাংশনগুলিতে আন্ডারস্কোর রয়েছে এবং কেন ( __init__উদাহরণস্বরূপ)?


8
@ অস্টিনহেনলি: নামের আগে এবং পরে ডাবল আন্ডারস্কোরের জন্য নয় । আপনি কেবল নামের আগে আন্ডারস্কোরগুলির কথা ভাবছেন ।



@ ম্যাকএম নোট করুন যে এই প্রশ্নটি নামের আগে এবং পরে আন্ডারস্কোর সম্পর্কে জিজ্ঞাসা করে, এবং আপনার প্রস্তাবিত সদৃশ লক্ষ্যটি কেবল নামের আগে আন্ডারস্কোর সম্পর্কে জিজ্ঞাসা করে। যদিও, আমি স্বীকার করি যে উত্তরগুলির কিছু উত্তরও এই কেসটিকে অন্তর্ভুক্ত করে।
জর্জি

উত্তর:


526

থেকে পাইথন কোড স্টাইল নির্দেশিকা - পাইথন 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__। এ জাতীয় নাম কখনও উদ্ভাবন করবেন না; এগুলি কেবল নথিভুক্ত হিসাবে ব্যবহার করুন।

নোট করুন যে ডাবল লিডিং এবং ট্রেলিং আন্ডারস্কোর সহ নামগুলি পাইথনের জন্য মূলত সংরক্ষিত রয়েছে: "এই জাতীয় নাম কখনই উদ্ভাবন করবেন না; কেবল তাদের ডকুমেন্টেড হিসাবে ব্যবহার করুন"।


6
রেমন্ড আরও ব্যাখ্যা করে যে আপনি কেন এই ভিডিওটির প্রায় 34 মিনিটের মধ্যে নাম ম্যাঙ্গিলিং আচরণটি শুরু করতে চান: youtube.com/watch?v=HTLu2DFOdTg
জনসিপ

5
সুতরাং একটি নামে একক শীর্ষস্থানীয় আন্ডারস্কোর এবং ডাবল নেতৃত্বাধীন আন্ডারস্কোরের মধ্যে পছন্দটি কি C ++ এবং জাভাতে সুরক্ষিত এবং প্রাইভেটের মধ্যে পছন্দ করার মতো? _সিং_লিডিং_ফাউন্ডসোর বাচ্চাদের দ্বারা পরিবর্তন করা যেতে পারে, তবে __ডুবিল_লিডিং_ফাউন্ডসোর পারবেন না?
অ্যালেক্স ডাব্লু

2
__double_leading_underscoreহয় এখনো প্রকাশ্য পরিবর্তনশীল কেবল সংঘর্ষ এড়াতে নতুন নামকরণ করা হয়।
সিজেড

59

অন্যান্য উত্তরদাতারা "বিশেষ" বা "যাদু" পদ্ধতিগুলির নামকরণের সম্মেলন হিসাবে ডাবল নেতৃস্থানীয় এবং অনুসরণের আন্ডারস্কোরগুলি বর্ণনা করার ক্ষেত্রে সঠিক।

আপনি যখন এই পদ্ধতিগুলি সরাসরি কল করতে পারেন ( [10, 20].__len__()উদাহরণস্বরূপ), আন্ডারস্কোরগুলির উপস্থিতি একটি ইঙ্গিত যা এই পদ্ধতিগুলি পরোক্ষভাবে ( len([10, 20])উদাহরণস্বরূপ) আহ্বান করার উদ্দেশ্যে করা হয় । বেশিরভাগ পাইথন অপারেটরগুলির একটি সম্পর্কিত "ম্যাজিক" পদ্ধতি রয়েছে (উদাহরণস্বরূপ, a[x]প্রার্থনা করার স্বাভাবিক উপায় a.__getitem__(x))।



5

প্রকৃতপক্ষে যখন আমি পিতা বা মাতা এবং শিশু শ্রেণির নামের মধ্যে পার্থক্য করতে পারি তখন _ পদ্ধতির নামগুলি ব্যবহার করি। আমি এমন কিছু কোড পড়েছি যা পিতামাতাদের ও শিশুদের ক্লাস তৈরির এই পদ্ধতি ব্যবহার করে। উদাহরণ হিসাবে আমি এই কোডটি সরবরাহ করতে পারি:

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)
    )

...


ডাবল আন্ডারস্কোর উপসর্গ কি এটি নয়?
এএমসি

1

এই কনভেনশনটি বিশেষ ভেরিয়েবল বা পদ্ধতিগুলির জন্য ব্যবহৃত হয় (তথাকথিত "যাদু পদ্ধতি") যেমন __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

0

অজগরটিতে __ এর ব্যবহার বোঝার জন্য একটি উদাহরণ যুক্ত করা হয়েছে। এখানে সমস্ত তালিকা __

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.