পাইথনের 'ব্যক্তিগত' পদ্ধতিগুলি আসলে ব্যক্তিগত কেন নয়?


657

পাইথন আমাদের নামের ডবল আন্ডারস্কোর prepending, ভালো দ্বারা একটি বর্গ মধ্যে 'ব্যক্তিগত' পদ্ধতি এবং ভেরিয়েবল তৈরি করার ক্ষমতা দেয়: __myPrivateMethod()। তাহলে, কীভাবে কেউ এটি ব্যাখ্যা করতে পারে

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!

চুক্তিটি কি ছিল?!

যারা এটি পুরোপুরি পায়নি তাদের জন্য আমি এটি একটি সামান্য ব্যাখ্যা করব।

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()

আমি সেখানে যা করেছি তা হ'ল একটি সার্বজনীন পদ্ধতি এবং একটি ব্যক্তিগত পদ্ধতি সহ একটি ক্লাস তৈরি করে তা ইনস্ট্যানিয়েট করা।

এরপরে, আমি এর সর্বজনীন পদ্ধতি বলি।

>>> obj.myPublicMethod()
public method

এরপরে, আমি চেষ্টা করি এবং এর ব্যক্তিগত পদ্ধতিটি কল করি।

>>> obj.__myPrivateMethod()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: MyClass instance has no attribute '__myPrivateMethod'

এখানে সবকিছু সুন্দর দেখাচ্ছে; আমরা এটি কল করতে অক্ষম। এটি আসলে 'ব্যক্তিগত'। ঠিক আছে, আসলে তা হয় না। অবজেক্টে দির () চালানো একটি নতুন যাদুবিদ্যার পদ্ধতি প্রকাশ করে যা অজগর আপনার সমস্ত 'ব্যক্তিগত' পদ্ধতির জন্য যাদু তৈরি করে।

>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']

এই নতুন পদ্ধতির নামটি সর্বদা একটি আন্ডারস্কোর হয়, তার পরে শ্রেণীর নাম এবং পরে পদ্ধতির নাম।

>>> obj._MyClass__myPrivateMethod()
this is private!!

এনক্যাপসুলেশনের জন্য এত কিছু, তাই না?

যাইহোক, আমি সর্বদা শুনেছি পাইথন এনক্যাপসুলেশন সমর্থন করে না, তবে কেন চেষ্টা করবেন? কি দেয়?


18
জাভা বা সি # এর ক্ষেত্রেও একই সত্য যদি আপনি প্রতিবিম্ব ব্যবহার করেন (যা আপনি সেখানে যা করছেন তা কোনওভাবে)।
0x434D53

4
এটি ইউনিট পরীক্ষার উদ্দেশ্যে তৈরি হয়েছিল, সুতরাং আপনি বাইরে থেকে আপনার শ্রেণীর ব্যক্তিগত পদ্ধতিগুলির পরীক্ষা করার জন্য সেই "হ্যাক" ব্যবহার করতে পারেন।
waas1919

16
ব্যক্তিগত পদ্ধতি পরীক্ষা করা কি একটি বিরোধী-নিদর্শন নয়? ব্যক্তিগত পদ্ধতিগুলি কিছু পাবলিক পদ্ধতিতে ব্যবহার করা হবে তা নিশ্চিত করার জন্য অন্যথায় এটি চিরতরে অব্যবহৃত। এবং ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করার সঠিক উপায় (থট ওয়ার্কস থেকে এতদূর আমার শেখার উপর ভিত্তি করে) হ'ল আপনি সর্বজনীন পদ্ধতির জন্য পরীক্ষাগুলি লিখুন যা সমস্ত ক্ষেত্রে আচ্ছাদন করে। যদি এটি কার্যকর হয়, আপনার বাইরে থেকে ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করার দরকার নেই need
বিষ্ণু নারানগ

3
@ বিষ্ণু নারাং: হ্যাঁ, এটাই প্রায়শই শেখানো হয়। তবে সর্বদা হিসাবে, " সর্বদা এটি করুন, কখনও তা করবেন না " এর প্রায় "ধর্মীয়" দৃষ্টিভঙ্গি হ'ল "কখনই" ভাল না। যদি ইউনিট পরীক্ষাগুলি রিগ্রেশন পরীক্ষার জন্য বা সর্বজনীন এপিআই পরীক্ষার জন্য "কেবল" ব্যবহৃত হয়, আপনার প্রাইভেট পরীক্ষা করার দরকার নেই। তবে আপনি যদি ইউনিট পরীক্ষা চালিত বিকাশ করেন তবে বিকাশের সময় প্রাইভেট পদ্ধতি পরীক্ষা করার ভাল কারণ রয়েছে (উদাহরণস্বরূপ যখন পাবলিক ইন্টারফেসের মাধ্যমে নির্দিষ্ট কিছু অস্বাভাবিক / চরম পরামিতিগুলি উপহাস করা কঠিন)। কিছু ভাষা / ইউনিট পরীক্ষার পরিবেশ আপনাকে এটি করতে দেয় না, যা আইএমএইচও ভাল নয়।
মার্কো ফ্রয়েডেনবার্গার

5
@ মারকোফ্রেডেনবার্গার ইউনিট পরীক্ষা চালিত বিকাশের অভিজ্ঞতা আমার আছে। প্রায়শই যখন প্যারামিটারগুলি উপহাস করা কঠিন হয়ে যায়, প্রায়শই এটি ডিজাইন পরিবর্তন করে এবং উন্নত করে সমাধান করা হয়। আমি এখনও এমন একটি দৃশ্যের মুখোমুখি হয়ে উঠতে পারি নি যেখানে নকশাটি নিখুঁত এবং তবুও ইউনিট টেস্টিং ব্যক্তিগত পদ্ধতির টেস্টিং এড়ানো অত্যন্ত কঠিন। আমি এই ধরনের ক্ষেত্রে সন্ধান করব। ধন্যবাদ। আপনি যদি আমাকে বুঝতে সাহায্য করতে পারেন তবে আপনার মাথা থেকে উপরে একটি দৃশ্য ভাগ করতে পারলে আমি প্রশংসা করব।
বিষ্ণু নারং

উত্তর:


592

স্ক্র্যামব্লিং নামটি সাব-ক্লাসগুলি দুর্ঘটনাক্রমে তাদের সুপারক্লাসগুলির ব্যক্তিগত পদ্ধতি এবং বৈশিষ্ট্যগুলিকে ওভাররাইড না করে তা নিশ্চিত করতে ব্যবহৃত হয়। এটি বাইরে থেকে ইচ্ছাকৃত অ্যাক্সেস প্রতিরোধ করার জন্য ডিজাইন করা হয়নি।

উদাহরণ স্বরূপ:

>>> class Foo(object):
...     def __init__(self):
...         self.__baz = 42
...     def foo(self):
...         print self.__baz
...     
>>> class Bar(Foo):
...     def __init__(self):
...         super(Bar, self).__init__()
...         self.__baz = 21
...     def bar(self):
...         print self.__baz
...
>>> x = Bar()
>>> x.foo()
42
>>> x.bar()
21
>>> print x.__dict__
{'_Bar__baz': 21, '_Foo__baz': 42}

অবশ্যই দুটি পৃথক ক্লাসের একই নাম থাকলে এটি ভেঙে যায়।


12
ডকস । বিভাগ: 9.6 ব্যক্তিগত ভেরিয়েবল এবং শ্রেণি-স্থানীয় রেফারেন্সে।
gjain

72
আমাদের মধ্যে যারা স্ক্রোল / অনুসন্ধান করতে খুব অলস: বিভাগ 9.6 সরাসরি লিঙ্ক
cod3monk3y

3
ভেরিয়েবলটিকে ব্যক্তিগত হিসাবে বিবেচনা করা উচিত তা নির্দিষ্ট করতে আপনার একক আন্ডারস্কোর লাগানো উচিত। আবার, এটি কাউকে আসলে এটি অ্যাক্সেস করা থেকে বাধা দেয় না।
আইগন

14
গিডো এই প্রশ্নের উত্তর দিয়েছিলেন - "আবিষ্কারযোগ্য সব কিছু করার প্রায় মূল কারণ (প্রায়) ডিবাগ করা ছিল: ডিবাগ করার সময় আপনাকে প্রায়শই বিমূর্ততাগুলি ভেঙে ফেলার প্রয়োজন হয়" - আমি এটিকে মন্তব্য হিসাবে যুক্ত করেছি কারণ অনেক দেরি হয়ে গেছে - অনেক উত্তর।
পিটার এম - এর অর্থ মনিকা

1
আপনি যদি "ইচ্ছাকৃত অ্যাক্সেস প্রতিরোধ করুন" মানদণ্ড অনুসরণ করেন তবে বেশিরভাগ ওওপি ভাষা সত্যিকারের ব্যক্তিগত সদস্যদের সমর্থন করে না। উদাহরণস্বরূপ সি ++ এ আপনার মেমরির কাঁচা অ্যাক্সেস রয়েছে এবং সি # বিশ্বস্ত কোডে ব্যক্তিগত প্রতিচ্ছবি ব্যবহার করতে পারেন।
কোডসইনচাউস

207

ব্যক্তিগত কাজ উদাহরণ

import re
import inspect

class MyClass :

    def __init__(self) :
        pass

    def private_function ( self ) :
        try :
            function_call = inspect.stack()[1][4][0].strip()

            # See if the function_call has "self." in the begining
            matched = re.match( '^self\.', function_call )
            if not matched :
                print 'This is Private Function, Go Away'
                return
        except :
            print 'This is Private Function, Go Away'
            return

        # This is the real Function, only accessible inside class #
        print 'Hey, Welcome in to function'

    def public_function ( self ) :
        # i can call private function from inside the class
        self.private_function()

### End ###

12
self = MyClass() self.private_function()। : ডি অবশ্যই এটি ক্লাসে কাজ করে না, তবে আপনাকে কেবল একটি কাস্টম ফাংশনটি সংজ্ঞায়িত করতে হবে: def foo(self): self.private_function()
কেসি কুবল

161
কেবল ক্ষেত্রে এটি পরিষ্কার ছিল না: রিয়েল কোডে কখনও এটি করবেন না ;)
সুডো বাশ

10
@ থারস্মমনার বা ঠিক function_call.startswith('self.')
nyuszika7h

13
inspect.stack()[1][4][0].strip()<- এই 1, 4 এবং 0 টি ম্যাজিক সংখ্যা কী?
আখি

5
এটি করে বেশ সহজেই পরাজিত করা যায় self = MyClass(); self.private_function()এবং x = self.private_function()কোনও পদ্ধতির অভ্যন্তরে যখন ডাকা হয় তখন এটি ব্যর্থ হয় ।
উইল

171

আমি যখন জাভা থেকে পাইথনে প্রথম এসেছি তখন আমি ঘৃণা করি । এটি আমাকে মৃত্যুর ভয়ে ভীত করে।

আজ এটি কেবলমাত্র আমি সবচেয়ে বেশি পছন্দ করি পাইথন সম্পর্কে ।

আমি একটি প্ল্যাটফর্মে থাকতে পছন্দ করি, যেখানে লোকেরা একে অপরকে বিশ্বাস করে এবং তাদের কোডের চারপাশে দুর্ভেদ্য দেয়াল তৈরি করার প্রয়োজন মনে হয় না। দৃ strongly়ভাবে এনক্যাপসুলেটেড ভাষাগুলিতে, যদি কোনও এপিআই-তে কোনও ত্রুটি থাকে এবং আপনি কী ভুল হয় তা নির্ধারণ করে থাকেন, তবে প্রয়োজনীয় পদ্ধতিটি ব্যক্তিগত থাকার কারণে আপনি এখনও এটিকে ঘিরে কাজ করতে অক্ষম হতে পারেন। পাইথনে মনোভাবটি: "নিশ্চিত"। আপনি যদি মনে করেন যে আপনি পরিস্থিতিটি বুঝতে পেরেছেন, সম্ভবত আপনি এটি পড়েও ফেলেছেন, তবে আমরা যা বলতে পারি তা হ'ল "সৌভাগ্য!"!

মনে রাখবেন, এনক্যাপসুলেশন এমনকি দুর্বলভাবে "সুরক্ষা", বা বাচ্চাদের লন থেকে দূরে রাখার সাথে সম্পর্কিত নয়। এটি কেবলমাত্র অন্য একটি প্যাটার্ন যা বোঝার জন্য একটি কোড বেসকে আরও সহজ করতে ব্যবহার করা উচিত।


36
@ ক্যামজ্যাকসন জাভাস্ক্রিপ্ট আপনার উদাহরণ? প্রোটোটাইবেড-ভিত্তিক উত্তরাধিকার এবং ফাংশনাল প্রোগ্রামিংয়ের পক্ষে এমন ভাষা রয়েছে এমন একমাত্র বহুল ব্যবহৃত ভাষা? আমি মনে করি যে অন্যান্য ভাষাগুলির তুলনায় জেএস শিখতে অনেক কঠিন, যেহেতু এটি traditionalতিহ্যবাহী ওওপি থেকে বেশ কয়েকটি অরথোগোনাল পদক্ষেপ নেয়। এটি জেএস লিখতে বোকা প্রতিরোধ করে না, তারা কেবল এটি জানেন না;)
কে.স্টেফ

23
এনপিপুলেশন কেন গুরুত্বপূর্ণ এবং কখন ব্যক্তিগত পদ্ধতিগুলি প্রাধান্য পাবে তার জন্য API গুলি আসলেই একটি দুর্দান্ত উদাহরণ। ব্যক্তিগত হওয়ার উদ্দেশ্যে একটি পদ্ধতি চলে যেতে পারে, স্বাক্ষর পরিবর্তন করতে পারে, বা পরবর্তী কোনও সংস্করণে সতর্কতা ছাড়াই - সমস্ত পরিবর্তনের সবচেয়ে খারাপ আচরণ হতে পারে। আপনার স্মার্ট, প্রাপ্তবয়স্ক দলের সদস্য কি সত্যিই মনে রাখবেন যে আপনি যখন আপডেট করবেন তখন থেকে এখন থেকে এক বছর পরপর কোনও ব্যক্তিগত-ব্যক্তিগত পদ্ধতিতে অ্যাক্সেস করেছিলেন? তিনি এমনকি সেখানে কাজ করা হবে?
জ্ঞানহীন

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

4
জাভাতে মেথড.সেটএ্যাক্সেসেবল এবং ফিল্ড.সেটঅ্যাক্সেসেবল রয়েছে। ভয়েরও?
টনি

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

144

Http://www.faqs.org/docs/diveintopython/fileinfo_private.html থেকে

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


201
বা গুইডো ভ্যান রসুম যেমন লিখেছেন: "আমরা সকলেই প্রাপ্তবয়স্ক।"

35
-1: এটি ঠিক ভুল। ডাবল আন্ডারস্কোরগুলি কখনই প্রথম স্থানে ব্যক্তিগত হিসাবে ব্যবহৃত হয় না। নীচে আলেয়ার উত্তরটি ম্যাংলিং সিনট্যাক্সের আসল উদ্দেশ্যটি বলে tells আসল সম্মেলনটি একটি একক আন্ডারস্কোর।
nosklo

2
কেবল একটি আন্ডারস্কোর দিয়ে চেষ্টা করুন এবং আপনি যে ফলাফল পাবেন তা দেখতে পাবেন। @ ননস্ক্লো
বিল্লাল বেগেরাদজ

93

সাধারণত ব্যবহৃত বাক্যটি হ'ল "আমরা সকলেই এখানে বয়স্কদের সম্মতি দিই"। একটি একক আন্ডারস্কোর (এক্সপোস করবেন না) বা ডাবল আন্ডারস্কোর (লুকিয়ে রাখুন) এর মাধ্যমে, আপনি আপনার শ্রেণীর ব্যবহারকারীকে বলছেন যে আপনি কোনওভাবে সদস্যকে 'ব্যক্তিগত' হতে চান। তবে, আপনি অন্য সকলকে দায়িত্বশীলতার সাথে আচরণ করার এবং এটির প্রতি শ্রদ্ধা জানাতে বিশ্বাস করছেন, যদি না তাদের কাছে বাধ্যতামূলক কারণ না থাকে (যেমন, ডিবাগার, কোড সমাপ্তি)।

আপনার যদি সত্যই ব্যক্তিগত কিছু থাকতে হবে তবে আপনি এটি একটি এক্সটেনশনে প্রয়োগ করতে পারেন (যেমন সিপিথনের সি তে)। তবে বেশিরভাগ ক্ষেত্রে আপনি কাজগুলি করার জন্য পাইথোনিক পদ্ধতিটি সহজভাবে শিখতে পারেন।


তাহলে কি কোনও ধরণের মোড়ক প্রোটোকল যা আমি সুরক্ষিত ভেরিয়েবল অ্যাক্সেস করতে ব্যবহার করব?
অনুভূতি

3
"প্রাইভেট" এর চেয়ে বেশি "সুরক্ষিত" ভেরিয়েবল নেই। যদি আপনি কোনও আন্ডারস্কোর দিয়ে শুরু হওয়া কোনও বৈশিষ্ট্য অ্যাক্সেস করতে চান তবে আপনি কেবল এটি করতে পারেন (তবে লক্ষ্য করুন যে লেখক এটিকে নিরুৎসাহিত করে)। আপনার যদি অবশ্যই একটি ডাবল আন্ডারস্কোর দিয়ে শুরু হওয়া কোনও অ্যাট্রিবিউট অ্যাক্সেস করতে হয় তবে আপনি নিজেকে ম্যাংলিং নামটি করতে পারেন তবে আপনি অবশ্যই এটি করতে চান না।
টনি মেয়ার

33

এটি আপনার পছন্দ মতো নয় যে কোনও ভাষায় সদস্যদের ব্যক্তিগতত্ব পেতে পারে না (সি ++ তে পয়েন্টার পাটিগণিত,। নেট / জাভাতে প্রতিচ্ছবি)।

মুল বক্তব্যটি হ'ল আপনি যদি দুর্ঘটনাক্রমে ব্যক্তিগত পদ্ধতিতে কল করার চেষ্টা করেন তবে আপনি একটি ত্রুটি পান। তবে আপনি যদি নিজেকে পায়ে গুলি করতে চান তবে এগিয়ে যান এবং এটি করুন।

সম্পাদনা: আপনি নিজের জিনিসগুলি ও-এনক্যাপসুলেশন দ্বারা সুরক্ষিত করার চেষ্টা করেন না, তাই না?


2
একদমই না. আমি কেবল এই বিষয়টি তৈরি করছি যে বিকাশকারীকে একটি সহজ, এবং আমার মতে যাদুবিদ্যার পক্ষে, 'ব্যক্তিগত' বৈশিষ্ট্যগুলি অ্যাক্সেসের উপায়।
উইলুর্ড

2
হ্যাঁ, আমি কেবল বিষয়টি তুলে ধরার চেষ্টা করেছি। এটিকে ব্যক্তিগত করা কেবল কম্পাইলারটিকে অভিযোগ করে "আপনার সরাসরি এটি অ্যাক্সেস করা উচিত নয়" বলে। কিন্তু কেউ সত্যিই এটি করতে পারে এটি করতে চায়। তবে হ্যাঁ, এটি অন্যান্য ভাষার চেয়ে পাইথনে আরও সহজ in
ম্যাক্সিমিলিয়ান

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

12

class.__stuffনামকরণের সম্মেলন প্রোগ্রামার জানি সে এক্সেস বোঝানো হয় না দেয় __stuffবাইরে থেকে। নাম ম্যাংলিং এটিকে দুর্ঘটনাক্রমে কেউ করবে না এমন সম্ভাবনা তৈরি করে।

সত্য, আপনি এখনও এটিকে ঘিরে কাজ করতে পারেন, অন্যান্য ভাষার চেয়ে এটি আরও সহজ (যা বিটিডাব্লুও আপনাকে এটি করতে দেয়) তবে পাইথনের কোনও প্রোগ্রামার যদি এটি এনক্যাপসুলেশন সম্পর্কে চিন্তা করেন তবে এটি কোনও কাজ করবে না।


12

মডিউল বৈশিষ্ট্যের নামগুলি যখন একটি একক আন্ডারস্কোর (যেমন _ফু) দিয়ে শুরু হয় তখন অনুরূপ আচরণ উপস্থিত থাকে।

যেমনটি ব্যবহার করা মডিউল বৈশিষ্ট্যগুলি এই from*পদ্ধতিটি ব্যবহার করার সময় আমদানি করা মডিউলটিতে অনুলিপি করা হবে না , যেমন:

from bar import *

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


12

এটি সেই ভাষা নকশা পছন্দগুলির মধ্যে একটি। কিছু স্তরে তারা ন্যায়সঙ্গত হয়। এগুলি এটি তৈরি করে যাতে আপনার পদ্ধতিটি চেষ্টা করার এবং কল করার জন্য আপনার পথ থেকে বেশ দূরে যেতে হবে এবং যদি আপনার সত্যিই এটির খারাপ প্রয়োজন হয় তবে আপনার অবশ্যই খুব ভাল কারণ থাকতে হবে!

ডিবাগিং হুকস এবং টেস্টিং অবশ্যই প্রয়োগ হিসাবে যথাযথভাবে ব্যবহার করা হিসাবে মনে আসে।


4

পাইথন ৩.৪ এর সাথে এটির আচরণ:

>>> class Foo:
        def __init__(self):
                pass
        def __privateMethod(self):
                return 3
        def invoke(self):
                return self.__privateMethod()


>>> help(Foo)
Help on class Foo in module __main__:

class Foo(builtins.object)
 |  Methods defined here:
 |
 |  __init__(self)
 |
 |  invoke(self)
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)

 >>> f = Foo()
 >>> f.invoke()
 3
 >>> f.__privateMethod()
 Traceback (most recent call last):
   File "<pyshell#47>", line 1, in <module>
     f.__privateMethod()
 AttributeError: 'Foo' object has no attribute '__privateMethod'

https://docs.python.org/3/tutorial/classes.html#tut-private

নোট করুন যে ম্যাংলিংয়ের নিয়মগুলি বেশিরভাগ দুর্ঘটনা এড়াতে ডিজাইন করা হয়েছে; ব্যক্তিগত হিসাবে বিবেচিত এমন একটি চলকটি অ্যাক্সেস বা সংশোধন করা এখনও সম্ভব। এটি এমনকি বিশেষ পরিস্থিতিতে যেমন ডিবাগারের ক্ষেত্রেও কার্যকর হতে পারে।

প্রশ্নটি পুরান হলেও আমি আশা করি আমার স্নিপেটটি সহায়ক হতে পারে।


2

ব্যক্তিগত পদ্ধতি এবং বৈশিষ্ট্যগুলি সম্পর্কে সর্বাধিক গুরুত্বপূর্ণ উদ্বেগ হ'ল বিকাশকারীদের বলুন যে এটি ক্লাসের বাইরে কল করবেন না এবং এটি এনক্যাপসুলেশন। কেউ encapsulation থেকে সুরক্ষা ভুল বুঝতে পারে। যখন আপনি ইচ্ছাকৃতভাবে সিনট্যাক্স ব্যবহার করেছেন (নমুনা) আপনি উল্লেখ করেছেন, আপনি এনক্যাপসুলেশন চান না।

obj._MyClass__myPrivateMethod()

আমি সি # থেকে স্থানান্তরিত হয়েছি এবং প্রথমে এটি আমার পক্ষেও অদ্ভুত ছিল তবে কিছুক্ষণ পরে আমার ধারণাটি এসেছিল যে পাইথন কোড ডিজাইনাররা ওওপি সম্পর্কে যেভাবে ভাবছেন তা কেবল ভিন্ন।


1

পাইথনের 'ব্যক্তিগত' পদ্ধতিগুলি আসলে ব্যক্তিগত কেন নয়?

আমি যেমন এটি বুঝতে পারি, তারা ব্যক্তিগত হতে পারে না । কীভাবে গোপনীয়তা প্রয়োগ করা যেতে পারে?

এর সুস্পষ্ট উত্তর হ'ল "ব্যক্তিগত সদস্যরা কেবল তার মাধ্যমে অ্যাক্সেস করতে পারবেন self", তবে এটি কার্যকর হবে না - selfপাইথনে এটি বিশেষ নয়, এটি কোনও ফাংশনের প্রথম প্যারামিটারের জন্য ব্যবহৃত ব্যবহৃত নাম ছাড়া আর কিছুই নয়।

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