পাইথনে বেসরকারী মডিউল ফাংশনগুলি সংজ্ঞায়িত করা হচ্ছে


238

Http://www.faqs.org/docs/diveintopython/fileinfo_private.html অনুসারে :

বেশিরভাগ ভাষার মতো পাইথনেরও ব্যক্তিগত উপাদানগুলির ধারণা রয়েছে:

  • ব্যক্তিগত ফাংশন, যা তাদের মডিউলটির বাইরে থেকে কল করা যায় না

তবে, আমি যদি দুটি ফাইল সংজ্ঞায়িত করি:

#a.py
__num=1

এবং:

#b.py
import a
print a.__num

যখন আমি b.pyএটি চালিত করি তখন 1কোনও ব্যতিক্রম ছাড়াই প্রিন্ট আউট হয় । ডিভাইনটোপিথন কি ভুল, বা আমি কিছু ভুল বুঝেছি? আর কিছু উপায় হয় না ব্যক্তিগত হিসাবে একটি মডিউল এর ফাংশন নির্ধারণ?


এটি ডাইভেন্টোপথথনটি ভুল নয়, তবে তাদের উদাহরণে: >>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse' fileinfo.MP3FileInfo () শ্রেণীর উদাহরণ instance আপনি ডাবল আন্ডারস্কোর ব্যবহার করার সময় যা এই ব্যতিক্রম দেয়। আপনার ক্ষেত্রে যেখানে আপনি কোনও ক্লাস তৈরি করেন নি, আপনি কেবল একটি মডিউল তৈরি করেছেন। আরও দেখুন: স্ট্যাকওভারফ্লো
হোমরো এসেমেরাল্ডো

উত্তর:


323

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

((বিটিডব্লিউ, যদিও এটি একটি নিবিড়ভাবে রক্ষিত গোপন, সি -++ এর সাথে অনেকটাই একইরকম: বেশিরভাগ সংকলক সহ আপনার ফাইলটি আইএন করার #define private publicআগে একটি সাধারণ লাইন যা আপনার "গোপনীয়তা" এর হ্যাশ তৈরি করতে উইলি কোডারদের জন্য লাগে! -)) )#include.h


82
সি ++ এ থাকা আপনার নোটটি ভুল। # ডেফাইন প্রাইভেট পাবলিক ব্যবহার করে আপনি সংকেতকারীকে প্রেরিত কোডটি পরিবর্তন করছেন যা নাম ম্যাংলিং হয়।
rhinoinrepose

14
এছাড়াও সি ++ ম্যাংলিং অস্পষ্ট, তবে খুব কমই গোপন। আপনি সি ++ দ্বারা উত্পাদিত বাইনারিটিকে "অন্তঃকরণ" করতে পারেন। ওটি, দুঃখিত।
অধ্যাপক ফ্যালকেন

47
@ রাইনোইনরেপোজ-এর আপডেট হিসাবে, এটি কেবল ভুল নয়, প্রিপ্রোসেসর ম্যাক্রোর সাহায্যে কোনও কীওয়ার্ডকে নতুনভাবে সংজ্ঞায়িত করার মান অনুযায়ী এটি অপরিজ্ঞাত আচরণ
কোরি ক্র্যামার

3
@ অ্যালেক্সমার্টেলি static void foo()যতটা বেসরকারী তা নয় Is এটি কমপক্ষে লিঙ্কারের কাছে লুকিয়ে রয়েছে এবং ফাংশনটি সম্পূর্ণ ইনলাইন করে মুছে ফেলা হতে পারে।
ব্যবহারকারীর 877329

3
বাস্তব জীবনে লোকেরা আইন ভাঙলে তাদের বিরুদ্ধে মামলা দায়ের করা যায়
লে গনজালেজ

288

শ্রেণি বেসরকারী এবং মডিউল বেসরকারীদের মধ্যে বিভ্রান্তি থাকতে পারে ।

একটি মডিউল ব্যক্তিগত একটি আন্ডারস্কোর দিয়ে শুরু হয় আমদানি কমান্ডের ফর্মটি
ব্যবহার করার সময় এই জাতীয় উপাদানটি অনুলিপি করা হয় না from <module_name> import *; এটি import <moudule_name>সিনট্যাক্স ব্যবহার করে তবে আমদানি করা হয় ( বেন উইলহেলমের উত্তর দেখুন )
প্রশ্নের উদাহরণের একটি .__ নাম্বার থেকে কেবল একটি আন্ডারস্কোর সরান এবং এটি মডিউলগুলিতে প্রদর্শিত হবে না যা from a import *সিনট্যাক্স ব্যবহার করে a.py আমদানি করে ।

একটি বর্গ ব্যক্তিগত দিয়ে শুরু হয় দুই আন্ডারস্কোর (ওরফে dunder অর্থাত ডি-ouble অধীনে স্কোর)
এই ধরনের একটি পরিবর্তনশীল এর নাম "mangled" classname ইত্যাদি অন্তর্ভুক্ত করা হয়েছে
এটা এখনও ম্যাঙ্গলেড নামের মাধ্যমে, বর্গ যুক্তিবিজ্ঞান বাইরে অ্যাক্সেস করতে পারবেন।
যদিও নাম ম্যাংলিং অননুমোদিত অ্যাক্সেসের বিরুদ্ধে হালকা প্রতিরোধের ডিভাইস হিসাবে কাজ করতে পারে তবে এর মূল উদ্দেশ্য পূর্বপুরুষ শ্রেণীর শ্রেণীর সদস্যদের সাথে নামের সংঘর্ষগুলি রোধ করা। তিনি এই ভেরিয়েবলের ক্ষেত্রে ব্যবহৃত কনভেনশনটি বর্ণনা করার সাথে সাথে বয়স্কদের সম্মতি জানাতে অ্যালেক্স মার্তেলির মজার কিন্তু সঠিক উল্লেখটি দেখুন ।

>>> class Foo(object):
...    __bar = 99
...    def PrintBar(self):
...        print(self.__bar)
...
>>> myFoo = Foo()
>>> myFoo.__bar  #direct attempt no go
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__bar'
>>> myFoo.PrintBar()  # the class itself of course can access it
99
>>> dir(Foo)    # yet can see it
['PrintBar', '_Foo__bar', '__class__', '__delattr__', '__dict__', '__doc__', '__
format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__
', '__subclasshook__', '__weakref__']
>>> myFoo._Foo__bar  #and get to it by its mangled name !  (but I shouldn't!!!)
99
>>>

ঠিক আছে, তিল __private_functionযদিও তারা মডিউল-স্তরের প্রয়োগ না করে তবেই কোনও কারণ ? আমি এটির মধ্যে দৌড়ে এসেছি এবং এর কারণে ত্রুটিগুলিতে পড়েছি।
সান্তা 21

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

1
@ এমজেভি এটি এমন সহায়ক ব্যাখ্যা! ধন্যবাদ! আমি এই আচরণটি সম্পর্কে কিছুক্ষণের জন্য বেশ বিস্মিত হয়েছি। আমি চাই যদি পছন্দটি কোনও অ্যাট্রিবিউটআরার ব্যতীত অন্য কোনও ধরণের ত্রুটি ছুঁড়ে মারত তবে যদি আপনি সরাসরি শ্রেণীর বেসরকারী অ্যাক্সেস করার চেষ্টা করেন; সম্ভবত একটি "প্রাইভেটঅ্যাক্সেসেরর" বা অন্য কিছু আরও স্পষ্ট / সহায়ক হতে পারে। (যেহেতু এটির কোনও বৈশিষ্ট্য নেই ত্রুটি পাওয়া সত্যই সত্য নয়)।
এইচএফব্রাউনিং

82

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

আপনি যদি কোনও মডিউলে ব্যক্তিগত নামগুলি সংজ্ঞায়িত করেন তবে সেই নামগুলি যে কোনও স্ক্রিপ্টে আমদানি করা হবে যা সিনট্যাক্স, 'আমদানি মডিউল_নাম' ব্যবহার করে। সুতরাং, ধরে নিই যে আপনি আপনার উদাহরণটিতে মডিউলটি ব্যক্তিগতভাবে সঠিকভাবে সংজ্ঞায়িত করেছেন, _num, a.py তে, ..

#a.py
_num=1

..আপনি এটি মডিউল নামের প্রতীক সহ b.py এ অ্যাক্সেস করতে সক্ষম হবেন:

#b.py
import a
...
foo = a._num # 1

এপিপি থেকে কেবল বেসরকারীগুলি আমদানি করতে আপনাকে সিনট্যাক্স থেকে অবশ্যই ব্যবহার করতে হবে :

#b.py
from a import *
...
foo = _num # throws NameError: name '_num' is not defined

স্পষ্টতার স্বার্থে, যাইহোক, মডিউলগুলি থেকে নামগুলি আমদানি করার পরিবর্তে সমস্ত '*' দিয়ে আমদানি করার চেয়ে স্পষ্ট হওয়া ভাল:

#b.py
from a import name1 
from a import name2
...

1
কোন ফাংশন / গ্রন্থাগার আমদানি করা হয় তা আপনি কোথায় নির্দিষ্ট করবেন? মধ্যে Init .py?
ফিস্টঅফফুরি 21

যখন _namesডাকা হয় তখন নাম সংঘর্ষের ঝুঁকি থাকে না import a- a._namesএই স্টাইলটি ব্যবহার করার সময় এগুলি অ্যাক্সেস হয় ।
জোশিয়াহ যোদার

@ ফিস্টঅফফুরি হ্যাঁ, আপনি __init__.pyফাইলটিতে আমদানি করা ফাংশনগুলি নির্দিষ্ট করে দিন । এটিতে কিছু সহায়তার জন্য এখানে দেখুন ।
মাইক উইলিয়ামসন

29

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

এখানে প্রাইভেট ক্লাস ফাংশনগুলির একটি উদাহরণ রয়েছে:

class foo():
    def bar(self): pass
    def __bar(self): pass

f = foo()
f.bar()   # this call succeeds
f.__bar() # this call fails

2
আমি মনে করি যে ওপি'র উদ্দেশ্যটি এমন ফাংশনগুলি লেখার জন্য যা এর বাইরে প্রবেশযোগ্য নয়, উদাহরণস্বরূপ, একটি বাণিজ্যিক প্যাকেজ। সে ক্ষেত্রে, এই উত্তরটি সম্পূর্ণ নয়। __Bar () ফাংশনটি এখনও বাইরে থেকে f._foo__bar () এর মাধ্যমে অ্যাক্সেসযোগ্য। অতএব, ডাবল-নেতৃস্থানীয় আন্ডারস্কোরগুলি এটিকে ব্যক্তিগত করে না।
সেভাকপ্রিম

24

আপনি একটি অভ্যন্তরীণ ফাংশন যুক্ত করতে পারেন:

def public(self, args):
   def private(self.root, data):
       if (self.root != None):
          pass #do something with data

এরকম কিছু যদি আপনার যদি গোপনীয়তার সেই স্তরের প্রয়োজন হয়।


9
কেন এটি সেরা উত্তর নয়?
সাফায়

2

এটি একটি প্রাচীন প্রশ্ন, তবে মডিউল ব্যক্তিগত (একটি আন্ডারস্কোর) এবং শ্রেণি-বেসরকারী (দুটি আন্ডারস্কোর) উভয়ই এখন স্ট্যান্ডার্ড ডকুমেন্টেশনে আচ্ছাদিত:

পাইথন টিউটোরিয়াল lasses ক্লাস » ব্যক্তিগত ভেরিয়েবল


1

ক্লোজার বা ফাংশন সহ এম্বেড করা এক উপায়। ব্রাউজারবিহীন প্ল্যাটফর্ম বা ব্রাউজার কর্মীদের জন্য প্রয়োজনীয় না হলেও এটি জেএসে সাধারণ।

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


-11

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

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