কোনও বস্তুর নামের আগে একক এবং ডাবল আন্ডারস্কোরটির অর্থ কী?


1288

পাইথনে কোনও বস্তুর নামের আগে নেতৃস্থানীয় আন্ডারস্কোর থাকার সঠিক অর্থ এবং উভয়ের মধ্যে পার্থক্য সম্পর্কে দয়া করে কেউ দয়া করে ব্যাখ্যা করতে পারেন?

এছাড়াও, এর অর্থ কি একই থাকে যে প্রশ্নে থাকা বস্তুটি একটি পরিবর্তনশীল, একটি ফাংশন, একটি পদ্ধতি ইত্যাদি কিনা?


2
অন্য থ্রেডের দুর্দান্ত সংক্ষিপ্ত উত্তর: stackoverflow.com/a/8689983/911945
আন্তন তারাসনকো

উত্তর:


1152

একক বোঝার

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

পিইপি -8 উদ্ধৃত করতে :

_সিং_লিডিং_আন্ডারস্কোর: দুর্বল "অভ্যন্তরীণ ব্যবহার" সূচক। উদাহরণস্বরূপ from M import *এমন বস্তু আমদানি করে না যার নাম আন্ডারস্কোর দিয়ে শুরু হয়।

ডাবল ইন্ডস্কোর (নাম ম্যাঙ্গলিং)

থেকে পাইথন ডক্স :

ফর্মটির কোনও শনাক্তকারী __spam(কমপক্ষে দুটি শীর্ষস্থানীয় আন্ডারস্কোর), অন্ততপক্ষে একটি অনুচক্রীকরণের আন্ডারস্কোরটি টেক্সটালি প্রতিস্থাপন করা হয় _classname__spam, যেখানে classnameশীর্ষস্থানীয় আন্ডারস্কোর (গুলি) ছিটিয়ে থাকা বর্তমান শ্রেণীর নাম রয়েছে। এই ম্যানলিংটি সনাক্তকারীটির সিনট্যাকটিক অবস্থান বিবেচনা ছাড়াই করা হয়, সুতরাং এটি শ্রেণিক-বেসরকারী উদাহরণ এবং শ্রেণীর ভেরিয়েবলগুলি, পদ্ধতিগুলি, গ্লোবালগুলিতে সঞ্চিত ভেরিয়েবলগুলি এবং উদাহরণগুলিতে সঞ্চিত ভেরিয়েবলগুলি সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে। অন্যান্য ক্লাসের উদাহরণে এই শ্রেণীর জন্য ব্যক্তিগত।

এবং একই পৃষ্ঠা থেকে একটি সতর্কতা:

নাম ম্যাংলিংয়ের উদ্দেশ্য শ্রেণীবদ্ধদের দ্বারা সংজ্ঞায়িত উদাহরণ ভেরিয়েবলগুলি সম্পর্কে চিন্তা না করে, বা শ্রেণীর বাইরে কোডের মাধ্যমে উদাহরণ ভেরিয়েবলগুলি দিয়ে মকিং না করে ক্লাসগুলি "প্রাইভেট" উদাহরণের ভেরিয়েবল এবং পদ্ধতিগুলি সংজ্ঞায়িত করার সহজ উপায় দেওয়ার উদ্দেশ্যে is নোট করুন যে ম্যাংলিংয়ের নিয়মগুলি বেশিরভাগ দুর্ঘটনা এড়াতে ডিজাইন করা হয়েছে; এখনও দৃ determined় আত্মার পক্ষে ব্যক্তিগত হিসাবে বিবেচিত একটি পরিবর্তনশীল অ্যাক্সেস বা সংশোধন করা সম্ভব।

উদাহরণ

>>> class MyClass():
...     def __init__(self):
...             self.__superprivate = "Hello"
...             self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}

17
ক্লাসে নেই এমন 2 আন্ডারস্কোর সহ কোনও ভেরিয়েবলের নাম ঘোষণা করা হলে কী হবে? এটি ঠিক একটি সাধারণ পরিবর্তনশীল তাই না?
ধ্রুব রামানি

5
__ভেরিয়েবলের নাম হিসাবে কেবল ডাবল আন্ডারস্কোরের অর্থ কী ? পছন্দa, __ = foo()
এজে

104
এই উত্তরটি অত্যন্ত বিভ্রান্তিমূলক, কারণ এটি পাঠককে বিশ্বাস করতে পরিচালিত করে যে ডানডোরস্কোরটি "অতিপ্রাইভেট" উদাহরণস্বরূপ তৈরি করতে ব্যবহৃত হয়। এই না কেস, যেমন এখানে ব্যাখ্যা রেমন্ড Hettinger, যিনি স্পষ্টভাবে বলে যে, dunderscore incorrrectly, ব্যক্তিগত চিহ্ন সদস্যদের ব্যবহার করা হয় যখন এটি ব্যক্তিগত বিপরীত হতে পরিকল্পনা করা হয়েছিল দ্বারা।
মার্কাস মেসকেনেন

13
@ মারকাসমেস্কেনেন আমি দ্বিমত পোষণ করছি, উত্তরটি ক্লাস-প্রাইভেট ভেরিয়েবল এবং পদ্ধতিগুলির উদাহরণ তৈরি করার জন্য স্পষ্টভাবে একটি ডানডোরস্কোর ব্যবহারের কথা উল্লেখ করেছে। যদিও ডায়ানডস্কোরটি এই পদ্ধতিগুলি এবং ভেরিয়েবলগুলি সহজেই সাবক্লাসগুলির দ্বারা ওভাররাইট করা (তাদের সর্বজনীন করে তোলা) করার জন্য ডিজাইন করা হয়েছিল, তবে ডানডোরস্কোর ব্যবহার class শ্রেণীর মধ্যে ব্যবহারের জন্য একটি ব্যক্তিগত উদাহরণ সংরক্ষণ করে।
arewm

6
@ মারকাসমেসকেনেন: সুপারক্লাস যেমন ক্লাববার্বিং না করে সুপারক্লাসের মতো একই নাম ব্যবহার করার জন্য সাবক্লাসের স্বাধীনতা রয়েছে - অন্য শব্দগুলিতে, সুপারক্লাসের ডেন্ডার নামগুলি নিজেরাই ব্যক্তিগত হয়ে যায়।
ইথান ফুরম্যান

311

এখনও অবধি দুর্দান্ত উত্তর তবে কিছু টিডিবিট অনুপস্থিত। একটি একক নেতৃস্থানীয় আন্ডারস্কোর ঠিক নয় শুধু একটি কনভেনশন: যদি আপনি ব্যবহার from foobar import *, এবং মডিউল foobarএকটি সংজ্ঞায়িত না __all__তালিকা, নাম মডিউল থেকে আমদানিকৃত না একটি নেতৃস্থানীয় আন্ডারস্কোর যাদের অন্তর্ভুক্ত। ধরা যাক এটি বেশিরভাগই একটি সম্মেলন, যেহেতু এই কেসটি বেশ অস্পষ্ট কোণ ;-)।

নেতৃস্থানীয়-আন্ডারস্কোর সম্মেলন ব্যাপকভাবে ব্যবহার করা হয় না শুধু জন্য ব্যক্তিগত নাম, কিন্তু কি সি ++ বলবে তার সংরক্ষিত বেশী - উদাহরণস্বরূপ, পদ্ধতি নাম যে সম্পূর্ণরূপে উদ্দেশ্যে হয় উপেক্ষিত উপশ্রেণী (এমনকি বেশী যে থাকতে থাকতে মধ্যে যেহেতু ওভাররাইড করা যেতে করার বেস ক্লাস তারা raise NotImplementedError! -) প্রায়শই একক-শীর্ষস্থানীয়-আন্ডারস্কোর নাম থাকে যা ক্লাসের উদাহরণগুলি ব্যবহার করে কোড (বা সাবক্লাস) ব্যবহার করে যা বলেছিল যে পদ্ধতিগুলি সরাসরি বলা হয় না।

উদাহরণস্বরূপ, হিসাবে FIFO তুলনায় বিভিন্ন কিউয়িং শৃঙ্খলা সহ কোনো থ্রেড-নিরাপদ কিউ করা, এক আমদানির সারি, Queue.Queue উপশ্রেণী, এবং ধরনের পদ্ধতি ওভাররাইড করে _getএবং _put; "ক্লায়েন্ট কোড" কখনই সেগুলি ("হুক") পদ্ধতিগুলিকে কল করে না, বরং ("সংগঠিত") পাবলিক পদ্ধতি যেমন putএবং এটি get(এটি টেম্পলেট পদ্ধতি নকশার প্যাটার্ন হিসাবে পরিচিত - উদাহরণস্বরূপ এখানে ভিডিওর ভিত্তিতে আকর্ষণীয় উপস্থাপনার জন্য দেখুন প্রতিলিপিটির সংক্ষিপ্তসারগুলি যুক্ত করে এই বিষয়ে আমার একটি আলোচনার)।

সম্পাদনা: আলোচনার বর্ণনায় ভিডিও লিঙ্কগুলি এখন ভেঙে গেছে। আপনি এখানে এবং এখানে প্রথম দুটি ভিডিও খুঁজে পেতে পারেন ।


1
সুতরাং আপনি কীভাবে সিদ্ধান্ত নেবেন যে + _var_nameব্যবহার var_nameবাদে ব্যবহার করবেন বা ব্যবহার করবেন কিনা __all__?
এন্ডোলিথ

3
@ এন্ডোলিথ আপনার কোডটির পাঠককে সিগন্যাল করার জন্য শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার করুন যে তারা সম্ভবত এটি ব্যবহার করবেন না (উদাহরণস্বরূপ, কারণ আপনি এটি সংস্করণ ২.০, অথবা এমনকি ১.১ এ পরিবর্তন করতে পারেন); __all__আপনি যখনই মডিউলটিকে from spam import *বন্ধুত্বপূর্ণ করতে চান ( স্পষ্টত ইন্টারপ্রেটার সহ) স্পষ্ট ব্যবহার করুন । বেশিরভাগ সময়, উত্তর দুটিই
abarnert

@ অ্যালেক্সমার্টেলি এই আমদানি সংক্রান্ত নিয়মটি কি ডক্সে বা অন্য কোথাও আইনত আলোচনা করা হয়েছে?
ভিক্রোবট

1
আমি সি ++ উপমা পছন্দ করি। প্রথমত, লোকেরা যখন _ ব্যক্তিগত বলে তখন আমি এটি অপছন্দ করি । স্পষ্টতই আমি উপমাগুলি নিয়ে কথা বলছি, যেহেতু পাইথনে কোনও কিছুই সত্যই ব্যক্তিগত নয় । শব্দার্থবিদ্যায় ডুব দেওয়ার সময় আমি বলতাম যে আমরা _জাভা সুরক্ষিত সাথে বেঁধে দিতে পারি যেহেতু জাভাতে সংগ্রহের অর্থ "উত্পন্ন ক্লাস এবং / অথবা একই প্যাকেজের মধ্যে"। প্যাকেজটি মডিউলটির সাথে প্রতিস্থাপন করুন যেহেতু পিইপি 8 ইতিমধ্যে আমাদের জানায় যে আমদানি _সম্পর্কে কথা বলার সময় কেবল কোনও কনভেনশন নয় *এবং সেখানে এটি রয়েছে। কোনও শ্রেণীর মধ্যে শনাক্তকারীদের সম্পর্কে কথা বলার সময় অবশ্যই __জাভার ব্যক্তিগত হিসাবে সমান হবে ।
মারিয়াস মুসনিকু

2
একটি শালীন উত্তর হলেও এটি প্রচুর স্ব-প্রচারমূলক।
হাইব্রিড ওয়েব দেব

298

__foo__: এটি কেবল একটি কনভেনশন, পাইথন সিস্টেমের নাম ব্যবহার করার উপায় যা ব্যবহারকারীর নামের সাথে বিরোধী নয়।

_foo: এটি কেবল একটি কনভেনশন, প্রোগ্রামারকে এটি নির্দেশ করার উপায় যে ভেরিয়েবলটি ব্যক্তিগত (পাইথনের অর্থ যা কিছু)।

__foo: এটির আসল অর্থ রয়েছে: দোভাষী এই নামটির পরিবর্তে এই নামটি _classname__fooঅন্য শ্রেণিতে একই নামের সাথে ওভারল্যাপ না হয়ে যায় তা নিশ্চিত করে ces

পাইথন বিশ্বে আর কোনও আন্ডারস্কোরের অর্থ নেই।

এই সম্মেলনে শ্রেণি, পরিবর্তনশীল, গ্লোবাল ইত্যাদির মধ্যে কোনও পার্থক্য নেই।


6
সবেমাত্র এসেছিল __fooএবং কৌতূহলী। এটি অন্যান্য শ্রেণীর সাথে একই পদ্ধতির নামের সাথে কীভাবে ওভারল্যাপ করতে পারে? মানে আপনি এখনও এটির মতো অ্যাক্সেস করতে হবে instance.__foo()(যদি এটি দোভাষী দ্বারা নাম পরিবর্তন না করা হয়), তাই না?
বিভাস দেবনাথ

81
এই লোকটি জানিয়েছে যে from module import *আন্ডারস্কোর-উপসর্গযুক্ত বস্তুগুলি আমদানি করে না। অতএব, _fooশুধুমাত্র একটি সম্মেলনের চেয়ে বেশি।
dotancohen

4
@ বিভাস: যদি শ্রেণি সাবক্ল্যাস Bক্লাস হয় Aএবং উভয়ই প্রয়োগ করে foo()তবে উত্তরাধিকারীদের থেকে B.foo()ওভাররাইড করে । এর উদাহরণ ছাড়া কেবল অ্যাক্সেস করতে সক্ষম হবে । .foo()ABB.foo()super(B).foo()
nnot101

3
জন্য __dunder__নাম, অন্তর্নিহিত আমন্ত্রণ উদাহরণস্বরূপ অভিধান লাফালাফি, তাই এটি কিছু কিছু ক্ষেত্রে শুধু একটি নামকরণ সম্মেলন চেয়ে সম্ভবত একটু বেশি (দেখুন বিশেষ পদ্ধতি লুকআপ datamodel অধ্যায়)।
উইম

205

._variable সেমিপ্রাইভেট এবং এটি কেবল সম্মেলনের জন্য

.__variableপ্রায়শই ভুলভাবে অতিশয় বেসরকারী হিসাবে বিবেচিত হয়, যখন এর আসল অর্থ দুর্ঘটনাজনিত অ্যাক্সেস রোধ করার জন্য কেবল নামকরণ করা [1]

.__variable__ সাধারণত বিল্টিন পদ্ধতি বা ভেরিয়েবলের জন্য সংরক্ষিত

আপনি .__mangledমরিয়া হয়ে চাইলে আপনি এখনও ভেরিয়েবল অ্যাক্সেস করতে পারেন। ডাবলটি কেবল নামফলকগুলিকে বা পুনরায় নামকরণ করে, এমন কিছুতে পরিবর্তনশীল undersinstance._className__mangled

উদাহরণ:

class Test(object):
    def __init__(self):
        self.__a = 'a'
        self._b = 'b'

>>> t = Test()
>>> t._b
'b'

t._b অ্যাক্সেসযোগ্য কারণ এটি কেবল সম্মেলনের মাধ্যমে লুকানো রয়েছে

>>> t.__a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Test' object has no attribute '__a'

t .__A খুঁজে পাওয়া যায় নি কারণ নামকরণের কারণে এটি আর বিদ্যমান নেই

>>> t._Test__a
'a'

অ্যাক্সেস করার মাধ্যমে instance._className__variableশুধু ডবল আন্ডারস্কোর নামের পরিবর্তে, আপনি গোপন মান অ্যাক্সেস করতে পারেন


তবে কীভাবে যদি "__a" ক্লাস ভেরিয়েবল হয় তবে আপনি পাইথন ডক্সের নির্দেশনা দিয়েও এটিকে অ্যাক্সেস করতে পারবেন না ..
ভিটিলিয় তেরজিভ

উত্তরাধিকারের ক্ষেত্রে আপনি ডাবল আন্ডারস্কোরের উদাহরণ সহ আপনার উত্তরটি আপডেট করতে পারেন?
পরিবর্তনশীল

115

শুরুতে একক আন্ডারস্কোর:

পাইথনের আসল ব্যক্তিগত পদ্ধতি নেই। পরিবর্তে, কোনও পদ্ধতি বা গুণবাচক নামের শুরুতে একটি আন্ডারস্কোর বলতে বোঝায় যে আপনার এই পদ্ধতিটি অ্যাক্সেস করা উচিত নয়, কারণ এটি API এর অংশ নয়।

class BaseForm(StrAndUnicode):

    def _get_errors(self):
        "Returns an ErrorDict for the data provided for the form"
        if self._errors is None:
            self.full_clean()
        return self._errors

    errors = property(_get_errors)

(এই কোড স্নিপেটটি জাঙ্গো উত্স কোড থেকে নেওয়া হয়েছিল: জ্যাঞ্জো / ফর্ম / ফর্ম.পি)। এই errorsকোডটিতে, একটি সর্বজনীন সম্পত্তি, তবে এই সম্পত্তিটি, _get_erferences কে যে পদ্ধতিটি বলে, সেটি "ব্যক্তিগত", সুতরাং আপনার এটি অ্যাক্সেস করা উচিত নয়।

শুরুতে দুটি আন্ডারস্কোর:

এটি প্রচুর বিভ্রান্তির সৃষ্টি করে। এটি কোনও ব্যক্তিগত পদ্ধতি তৈরি করতে ব্যবহার করা উচিত নয়। আপনার পদ্ধতিটি একটি সাবক্লাস দ্বারা ওভাররাইড হওয়া বা দুর্ঘটনাক্রমে অ্যাক্সেস হওয়া এড়ানোর জন্য ব্যবহার করা উচিত। আসুন একটি উদাহরণ দেখুন:

class A(object):
    def __test(self):
        print "I'm a test method in class A"

    def test(self):
        self.__test()

a = A()
a.test()
# a.__test() # This fails with an AttributeError
a._A__test() # Works! We can access the mangled name directly!

আউটপুট:

$ python test.py
I'm test method in class A
I'm test method in class A

এখন একটি সাবক্লাস বি তৈরি করুন এবং __তম পদ্ধতির জন্য কাস্টমাইজেশন করুন

class B(A):
    def __test(self):
        print "I'm test method in class B"

b = B()
b.test()

আউটপুট হবে ....

$ python test.py
I'm test method in class A

যেমনটি আমরা দেখেছি, এস্টেস্ট () বি .__ পরীক্ষা () পদ্ধতিগুলি কল করেনি, যেমনটি আমরা আশা করতে পারি। তবে বাস্তবে, এটি __ এর জন্য সঠিক আচরণ। __Est () নামক দুটি পদ্ধতির স্বয়ংক্রিয়ভাবে নাম পরিবর্তিত হয়ে (মাংলড) _ এ_এস্টেস্ট () এবং _ বি__েস্ট () করা হয়েছে, সুতরাং এগুলি দুর্ঘটনাক্রমে ওভাররাইড হয় না। আপনি যখন __ দিয়ে শুরু করে কোনও পদ্ধতি তৈরি করেন তার অর্থ হ'ল আপনি কারও কাছে এটি ওভাররাইড করতে সক্ষম হতে চান না এবং আপনি কেবল নিজের শ্রেণীর অভ্যন্তর থেকে এটিকে অ্যাক্সেস করতে চান।

শুরুতে এবং শেষে দুটি আন্ডারস্কোর:

আমরা যখন কোনও পদ্ধতি দেখি তখন __this__এটিকে কল করি না। এটি এমন একটি পদ্ধতি যা অজগরকে কল করার জন্য বোঝানো হয়, আপনি নয়। এর কটাক্ষপাত করা যাক:

>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11

>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60

সর্বদা কোনও অপারেটর বা নেটিভ ফাংশন থাকে যা এই যাদু পদ্ধতিগুলিকে কল করে। কখনও কখনও এটি নির্দিষ্ট পরিস্থিতিতে কেবল একটি হুক অজগর কল। উদাহরণস্বরূপ __init__()যখন অবজেক্টটি তৈরি করা __new__()হয় তখন উদাহরণটি তৈরি করার জন্য ডাকা হয় ...

একটি উদাহরণ নেওয়া যাক ...

class FalseCalculator(object):

    def __init__(self, number):
        self.number = number

    def __add__(self, number):
        return self.number - number

    def __sub__(self, number):
        return self.number + number

number = FalseCalculator(20)
print number + 10      # 10
print number - 20      # 40

আরও তথ্যের জন্য, পিইপি -8 গাইড দেখুন । আরও যাদু পদ্ধতির জন্য এই পিডিএফটি দেখুন


1
সম্পাদনা এই উত্তরটি নিজেকে পর, আমি পছন্দ stackoverflow.com/a/8689983/1048186
ব্যতীত JosiahYoder-deactive ..

"যেমনটি আমরা দেখেছি, এস্টেস্ট () বি .__ পরীক্ষা () পদ্ধতিগুলি কল করেনি" - এর অর্থ আপনি কী বোঝাতে চেয়েছেন - আপনি এস্টেস্ট () কোথায় বলেছেন?
পরিবর্তনশীল

18

কখনও কখনও আপনার কাছে যেমন শীর্ষস্থানীয় আন্ডারস্কোর হিসাবে একটি টুপল বলে মনে হয়

def foo(bar):
    return _('my_' + bar)

এই ক্ষেত্রে, যা চলছে তা _ () হ'ল স্থানীয়করণ ফাংশনের জন্য একটি নাম যা লোকেলের উপর ভিত্তি করে যথাযথ ভাষা ইত্যাদিতে পাঠ্যের উপর পরিচালনা করে। উদাহরণস্বরূপ, স্পিনিক্স এটি করে এবং আপনি আমদানির মধ্যে খুঁজে পাবেন

from sphinx.locale import l_, _

এবং স্ফিংক্স.লোকালে, _ () কে কিছু স্থানীয়করণের ফাংশনটির একটি নাম হিসাবে নির্ধারিত করা হয়েছে।


9

যেহেতু অনেক লোক রেমন্ডের আলাপের কথা উল্লেখ করছে , তাই তিনি যা বলেছিলেন তা লিখে আমি এটি কিছুটা সহজ করব:

ডাবল আন্ডারস্কোরগুলির উদ্দেশ্য গোপনীয়তা সম্পর্কে নয়। উদ্দেশ্যটি হ'ল একে একে ঠিকভাবে ব্যবহার করা

class Circle(object):

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        p = self.__perimeter()
        r = p / math.pi / 2.0
        return math.pi * r ** 2.0

    def perimeter(self):
        return 2.0 * math.pi * self.radius

    __perimeter = perimeter  # local reference


class Tire(Circle):

    def perimeter(self):
        return Circle.perimeter(self) * 1.25

এটি প্রকৃতপক্ষে গোপনীয়তার বিপরীত, এটি সমস্ত স্বাধীনতার about এটি আপনার সাবক্লাসগুলি অন্যকে ভঙ্গ না করে যে কোনও একটি পদ্ধতির ওভাররাইড করতে মুক্ত করে তোলে

তোমাদের মধ্যে একজন স্থানীয় রেফারেন্স রাখি না বলুন perimeterমধ্যে Circle। এখন, একটি উদ্ভূত শ্রেণি স্পর্শ ছাড়াই Tireবাস্তবায়নটিকে ওভাররাইড করে । আপনি যখন কল করবেন তখন তত্ত্বীয়ভাবে এটি এখনও গণনার জন্য ব্যবহার করা উচিত তবে বাস্তবে এটি ব্যবহার করা হয় যা উদ্দেশ্যমূলক আচরণ নয়। সে কারণেই আমাদের চেনাশোনাতে স্থানীয় রেফারেন্স দরকার।perimeterareaTire(5).area()Circle.perimeterTire.perimeter

তবে এর __perimeterবদলে কেন _perimeter? কারণ _perimeterএখনও উদ্ভূত শ্রেণিকে ওভাররাইড করার সুযোগ দেয়:

class Tire(Circle):

    def perimeter(self):
        return Circle.perimeter(self) * 1.25

    _perimeter = perimeter

ডাবল আন্ডারস্কোরগুলির নাম ম্যাংলিং রয়েছে, তাই প্যারেন্ট ক্লাসে স্থানীয় রেফারেন্স উত্পন্ন শ্রেণিতে ওভাররাইড হওয়ার খুব কম সুযোগ রয়েছে। সুতরাং " আপনার সাবক্লাসগুলি অন্যকে ভঙ্গ না করে যে কোনও একটি পদ্ধতির ওভাররাইড করতে মুক্ত করে তোলে "।

যদি আপনার শ্রেণি উত্তরাধিকার সূত্রে প্রাপ্ত হয় না, বা পদ্ধতি ওভাররাইড করা কোনও কিছু না ভাঙে, তবে আপনার কেবল প্রয়োজন হবে না __double_leading_underscore


আপনাকে ধন্যবাদ, স্লাইডটি সঠিকভাবে প্রদর্শন করা যায় নি তাই আমার কোডটি কেন ব্যর্থ হবে তা আমি নিরবচ্ছিন্ন না করে শেষ করেছি।
সিজিটি

8

যদি কেউ সত্যিই কেবল একটি পরিবর্তনীয় কেবল পঠন করতে চান, তবে আইএমএইচওর মধ্যে সবচেয়ে ভাল উপায় হ'ল সম্পত্তিটি () কেবল এতে প্রবেশ করানো সহ ব্যবহার করা। সম্পত্তি () সহ আমাদের ডেটার উপরে সম্পূর্ণ নিয়ন্ত্রণ থাকতে পারে।

class PrivateVarC(object):

    def get_x(self):
        pass

    def set_x(self, val):
        pass

    rwvar = property(get_p, set_p)  

    ronly = property(get_p) 

আমি বুঝতে পারি যে ওপি কিছুটা ভিন্ন প্রশ্ন জিজ্ঞাসা করেছে তবে যেহেতু আমি এই প্রশ্নটির সাথে 'কীভাবে ব্যক্তিগত ভেরিয়েবলগুলি সেট করতে হবে' চিহ্নিত চিহ্নটির অনুরূপ অন্য একটি প্রশ্ন জিজ্ঞাসা করেছি, আমি এই অতিরিক্ত তথ্যটি এখানে যুক্ত করার চিন্তাভাবনা করেছি।


6

থেকে Accroding https://dbader.org/blog/meaning-of-underscores-in-python

  • একক শীর্ষস্থানীয় আন্ডারস্কোর (_var) : নাম উল্লেখ করে নামকরণ কনভেনশন অভ্যন্তরীণ ব্যবহারের জন্য বোঝানো হয়। সাধারণত পাইথন দোভাষী দ্বারা প্রয়োগ করা হয় না (ওয়াইল্ডকার্ড আমদানি বাদে) এবং কেবল প্রোগ্রামারকে ইঙ্গিত হিসাবে বোঝানো হয়।
  • একক ট্রেলিং অ্যান্ডস্কোর (var_) : পাইথন কীওয়ার্ডগুলির সাথে নামকরণ বিরোধগুলি এড়াতে কনভেনশন দ্বারা ব্যবহৃত হয়।
  • ডাবল লিডিং অ্যান্ডস্কোর (__ ভ্যার) : শ্রেণি প্রসঙ্গে ব্যবহৃত হলে নামগুলি ম্যাঙ্গলিং ট্রিগার। পাইথন দোভাষী দ্বারা প্রয়োগ করা হয়েছে।
  • ডাবল লিডিং এবং ট্রেলিং অ্যান্ডস্কোর (__ var__) : পাইথন ভাষার দ্বারা সংজ্ঞায়িত বিশেষ পদ্ধতিগুলি নির্দেশ করে। আপনার নিজস্ব বৈশিষ্ট্যের জন্য এই নামকরণ স্কিমটি এড়িয়ে চলুন।
  • একক বোঝাপড়া (_) : কখনও কখনও অস্থায়ী বা তুচ্ছ ভেরিয়েবলের নাম হিসাবে ব্যবহৃত হয় ("যত্ন করবেন না")। এছাড়াও: পাইথন আরপিএলে শেষ প্রকাশের ফলাফল।

4

একক নেতৃস্থানীয় আন্ডারস্কোরগুলি একটি সম্মেলন। নামগুলি যদি একক আন্ডারস্কোর দিয়ে শুরু হয় বা না হয় তবে দোভাষীর দৃষ্টিভঙ্গি থেকে কোনও পার্থক্য নেই।

ডাবল সামনের এবং পিছনের আন্ডারস্কোর জন্য ব্যবহার করা হয় বিল্ট-ইন যেমন পদ্ধতি, __init__, __bool__, ইত্যাদি

ডাবল লিডিং আন্ডারস্কোর ডাব্লু / ও ট্রিলিং সমকক্ষগুলিও একটি সম্মেলন, তবে, ক্লাস পদ্ধতিগুলি দোভাষীর দ্বারা ম্যাঙ্গেল করা হবে । ভেরিয়েবল বা বেসিক ফাংশন নামের জন্য কোনও পার্থক্য বিদ্যমান।


4

দুর্দান্ত উত্তর এবং সবগুলি সঠিক I আমি সাধারণ সংজ্ঞা / অর্থের পাশাপাশি একটি সহজ উদাহরণ সরবরাহ করেছি।

অর্থ:

কিছু_ পরিবর্তনশীল - - এটি সর্বজনীন যে কেউ এটি দেখতে পারে।

_সোম_ভেরিয়েবল - - এটি সর্বজনীন যে কেউ এটি দেখতে পারে তবে এটি ব্যক্তিগতকে নির্দেশ করার জন্য একটি সম্মেলন ... সতর্কবাণী পাইথনের দ্বারা কোনও প্রয়োগকরণ সম্পন্ন করা হয়নি।

__some_varaable --► পাইথন পরিবর্তনশীল নামটিকে _ ক্লাসনাম__সোম_ভ্যারিয়েবল (একে নাম নেওয়ার ম্যাঙ্গলিং) এর সাথে প্রতিস্থাপন করে এবং এটি তার দৃশ্যমানতা হ্রাস / লুকিয়ে রাখে এবং আরও ব্যক্তিগত ভেরিয়েবলের মতো হতে পারে।

পাইথন ডকুমেন্টেশন অনুসারে এখানে সৎ হতে হবে

"" ব্যক্তিগত "উদাহরণের ভেরিয়েবলগুলি যা অজন্তুর অভ্যন্তর থেকে পাইথনে বিদ্যমান নেই তা ছাড়া অ্যাক্সেস করা যায় না"

উদাহরণ:

class A():
    here="abc"
    _here="_abc"
    __here="__abc"


aObject=A()
print(aObject.here) 
print(aObject._here)
# now if we try to print __here then it will fail because it's not public variable 
#print(aObject.__here)

_ _ কিছু_ভ্যারাবল - .... এবং এটি এর দৃশ্যমানতা হ্রাস / আড়াল করে এবং আরও ব্যক্তিগত ভেরিয়েবলের মতো হতে পারে। না, নাম ম্যাঙ্গালিংটি মূল বিষয়, এটি পদ্ধতিটি লুকায় না।
এএমসি

3

আপনার প্রশ্নটি ভাল, এটি কেবল পদ্ধতি সম্পর্কে নয়। মডিউলগুলিতে ফাংশন এবং অবজেক্টগুলি সাধারণত একটি আন্ডারস্কোর সহ উপসর্গযুক্ত হয় এবং দুটি দ্বারা উপসর্গ করা যেতে পারে।

তবে __ডুবল_আউন্ডসোর নামগুলি মডিউলগুলিতে নাম-ম্যাংডড নয়। যা ঘটে তা হ'ল এক (বা আরও বেশি) আন্ডারস্কোর দিয়ে শুরু হওয়া নামগুলি আমদানি করা হয় না যদি আপনি মডিউল থেকে সমস্তগুলি আমদানি করেন (মডিউল আমদানি *), না হয় সাহায্যের নাম (মডিউল) দেখানো হয়।


1
তদ্ব্যতীত, এক বা একাধিক আন্ডারস্কোর দিয়ে শুরু হওয়া নামগুলিতে দুটি বা ততোধিক ট্রেলিং আন্ডারস্কোরগুলি অন্য কোনও নাম হিসাবে আবার আচরণ করে।
বেন্টলে

3

ডাবল আন্ডারস্কোর বৈশিষ্ট্য কীভাবে উত্তরাধিকার সূত্রে প্রাপ্ত বর্গকে প্রভাবিত করতে পারে সে সম্পর্কে এখানে একটি সাধারণ চিত্রণমূলক উদাহরণ। নীচের সেটআপ সহ:

class parent(object):
    __default = "parent"
    def __init__(self, name=None):
        self.default = name or self.__default

    @property
    def default(self):
        return self.__default

    @default.setter
    def default(self, value):
        self.__default = value


class child(parent):
    __default = "child"

আপনি যদি পাইথন আরপিএলে একটি শিশু উদাহরণ তৈরি করেন, আপনি নীচে দেখতে পাবেন

child_a = child()
child_a.default            # 'parent'
child_a._child__default    # 'child'
child_a._parent__default   # 'parent'

child_b = child("orphan")
## this will show 
child_b.default            # 'orphan'
child_a._child__default    # 'child'
child_a._parent__default   # 'orphan'

এটি কারওর কাছে সুস্পষ্ট হতে পারে তবে এটি আরও জটিল পরিবেশে আমাকে পাহারায় ফেলেছিল


3

"প্রাইভেট" ইনস্ট্যান্স ভেরিয়েবলগুলি অ্যাক্সেস করা যায় না কেবলমাত্র কোনও বস্তুর ভিতরে থেকে পাইথনে অস্তিত্ব নেই। তবে বেশিরভাগ পাইথন কোড অনুসরণ করে একটি কনভেনশন রয়েছে: আন্ডারস্কোর (যেমন _ স্প্যাম) এর উপসর্গযুক্ত একটি নামকে এপিআই-এর একটি সর্বজনীন অংশ হিসাবে বিবেচনা করা উচিত (এটি কোনও ফাংশন, পদ্ধতি বা কোনও ডেটা সদস্য) । এটি একটি বাস্তবায়ন বিশদ হিসাবে বিবেচনা করা উচিত এবং বিজ্ঞপ্তি ছাড়াই পরিবর্তন সাপেক্ষে।

রেফারেন্স https://docs.python.org/2/tutorial/class.html#private-variables-and-class-local-references


1
_ সি এর মধ্যে অভ্যন্তরীণ উদাহরণগুলির সাথে প্রাইভেটের সাথে অনেক বেশি মিল। ডাবল আন্ডারস্কোর এটি প্রাইভেটের সাথে অনেক বেশি অনুরূপ তবে আন্ডারস্কোরটি প্রাইভেটের সাথে আমি বলব।
Ini থেকে

2

_ এবং __ এর তথ্য পাওয়া খুব সহজ; অন্যান্য উত্তরগুলি এগুলি বেশ ভালভাবে প্রকাশ করে। ব্যবহার নির্ধারণ করা অনেক কঠিন।

আমি এটি দেখতে এইভাবে:

_

এটি বোঝাতে ব্যবহার করা উচিত যে কোনও ফাংশন জনসাধারণের ব্যবহারের জন্য নয় যেমন উদাহরণস্বরূপ একটি এপিআই। এটি এবং আমদানি নিষেধাজ্ঞাগুলি এটি internalসি # তে অনেকটা আচরণ করে make

__

উত্তরাধিকারী হায়ারচি নামকরণের সংঘর্ষ এড়াতে এবং লেটবাইন্ডিং এড়াতে ব্যবহার করা উচিত। অনেকটা সি # তে ব্যক্তিগতের মতো।

==>

আপনি যদি ইঙ্গিত করতে চান যে কোনও কিছু জনসাধারণের ব্যবহারের জন্য নয় তবে এটি protectedব্যবহারের মতো কাজ করা উচিত _। আপনি যদি ইঙ্গিত করতে চান যে কোনও কিছু জনসাধারণের ব্যবহারের জন্য নয় তবে এটি privateব্যবহারের মতো কাজ করা উচিত __

এটি একটি উদ্ধৃতি যা আমি খুব পছন্দ করি:

সমস্যাটি হ'ল কোনও শ্রেণীর লেখক বৈধভাবে "এই বৈশিষ্ট্য / পদ্ধতির নামটি ব্যক্তিগত হওয়া উচিত, কেবল এই শ্রেণীর সংজ্ঞার মধ্যে থেকে অ্যাক্সেসযোগ্য" এবং __private কনভেনশন ব্যবহার করতে পারেন। তবে পরবর্তী সময়ে, সেই শ্রেণীর ব্যবহারকারী একটি সাবক্লাস তৈরি করতে পারেন যা বৈধভাবে এই নামে অ্যাক্সেসের প্রয়োজন needs সুতরাং হয় সুপারক্লাসটি সংশোধন করতে হবে (যা কঠিন বা অসম্ভব হতে পারে), অথবা সাবক্লাস কোডটিকে ম্যানুয়ালি ম্যাংডেড নামগুলি ব্যবহার করতে হবে (যা সবচেয়ে কুৎসিত এবং ভঙ্গুর)।

তবে এর সাথে সমস্যাটি আমার মতে এই যে কোনও আইডিই যদি আপনাকে সতর্কতা অবলম্বন করে না যে আপনি যখন পদ্ধতিগুলি ওভাররাইড করেন, ত্রুটিটি খুঁজে পেতে আপনাকে কিছুটা সময় নিতে পারে যদি আপনি কোনও বেস-ক্লাস থেকে কোনও পরিচয় সনাক্ত করতে পারেন না।

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