পাইথনে "প্রাইভেট" (বাস্তবায়ন) শ্রেণি


106

আমি দুটি ছোট অংশের সমন্বয়ে একটি ছোট পাইথন মডিউল কোডিং করছি:

  • কিছু ফাংশন পাবলিক ইন্টারফেস সংজ্ঞায়িত করে,
  • উপরোক্ত ফাংশনগুলি দ্বারা ব্যবহৃত একটি বাস্তবায়ন ক্লাস, তবে এটি মডিউলটির বাইরে অর্থবহ নয়।

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

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

উত্তর:


174

একটি একক আন্ডারস্কোর উপসর্গ ব্যবহার করুন:

class _Internal:
    ...

এটি 'অভ্যন্তরীণ' প্রতীকগুলির জন্য অফিসিয়াল পাইথন সম্মেলন; "মডিউল আমদানি * থেকে" আন্ডারস্কোর-উপসর্গযুক্ত বস্তু আমদানি করে না।

সম্পাদনা করুন: একক আন্ডারস্কোর সম্মেলনের উল্লেখ


3
ক্লাস পর্যন্ত প্রসারিত আন্ডারস্কোর নিয়মটি আমি জানতাম না। আমদানি করার সময় আমি আমার নাম স্থানটি বিশৃঙ্খলা করতে চাই না, তাই এই আচরণটি আমি যা খুঁজছিলাম is ধন্যবাদ!
অস্বচ্ছ

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

11
python.org/dev/peps/pep-0008 - _single_leading_underscore: দুর্বল "অভ্যন্তরীণ ব্যবহার" সূচক। উদাহরণস্বরূপ "এম ইম্পোর্ট * থেকে" "এমন বস্তু আমদানি করে না যার নাম আন্ডারস্কোর দিয়ে শুরু হয়। - অভ্যন্তরীণ ব্যবহারের ক্লাসগুলির একটি শীর্ষস্থানীয় আন্ডারস্কোর রয়েছে
মাইলস

2
একজন নেতৃস্থানীয় আন্ডারস্কোর অভ্যন্তরীণ এখানে কিছু চিহ্নিত করার জন্য সম্মেলন হয়, "না জগাখিচুড়ি এই না," যেহেতু সব অগত্যা implying ছাড়া, "এম আমদানি থেকে *" সঙ্গে ব্যবহার করা পরিকল্পিত মডিউল জন্য আরো যে মডিউল ব্যবহারকারীদের স্পর্শ করতে না পারে যে ক্লাস।
মাইলস

65

সংক্ষেপে:

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

  2. আপনি কেবল গোপনীয়তার নির্দেশ / পরামর্শ দিতে পারবেন । এটি একটি সম্মেলন অনুসরণ করে। শ্রেণি / ফাংশন / পদ্ধতিটিকে ব্যক্তিগত হিসাবে চিহ্নিত করার জন্য পাইথন কনভেনশনটি এটি একটি _ (আন্ডারস্কোর) দিয়ে প্রফেস করা হয়। উদাহরণস্বরূপ, def _myfunc()বা class _MyClass:। আপনি দুটি আন্ডারস্কোর (উদাহরণস্বরূপ __foo) দিয়ে পদ্ধতিটিকে পূর্বনির্দেশ দিয়ে ছদ্ম গোপনীয়তা তৈরি করতে পারেন । আপনি সরাসরি পদ্ধতিটিতে অ্যাক্সেস করতে পারবেন না, তবে আপনি ক্লাসের নাম ব্যবহার করে একটি বিশেষ উপসর্গের মাধ্যমে কল করতে পারেন (যেমন _classname__foo:)। সুতরাং আপনি সবচেয়ে ভাল যা করতে পারেন তা হ'ল গোপনীয়তার নির্দেশ / পরামর্শ দেওয়া, এটি প্রয়োগ করা নয়।

পাইথন এই ক্ষেত্রে পার্ল মত। পার্ল বইয়ের গোপনীয়তা সম্পর্কে একটি বিখ্যাত লাইনটি চিত্রিত করার জন্য, দর্শনটি হ'ল আপনার বসার ঘর থেকে দূরে থাকুন কারণ আপনাকে আমন্ত্রণ করা হয়নি, এটি শটগান দিয়ে রক্ষিত হওয়ার কারণে নয়।

আরও তথ্যের জন্য:


# 1 এর প্রতিক্রিয়া হিসাবে, আপনি বাছাই পদ্ধতিগুলির গোপনীয়তা প্রয়োগ করতে পারেন। __ আদর্শ (স্ব) এর মতো একটি ডাবল আন্ডারস্কোর ব্যবহার এটিকে শ্রেণীর বাইরে অ্যাক্সেসযোগ্য করে তুলবে। তবে এর চারপাশে একটি উপায় রয়েছে যার নাম এটিকে বলা, ফু () ._ ফু_মোথড ()। আমি অনুমান করি যে এটি কেবল এর আরও নামযুক্ত কিছু নামকরণ করেছে।
ইভান ফসমার্ক

1
সেই উক্তিটি সঠিক।
পল ড্রাগন


10

আমি একটি প্যাটার্ন যা মাঝে মাঝে ব্যবহার করি তা হ'ল:

একটি শ্রেণী নির্ধারণ করুন:

class x(object):
    def doThis(self):
        ...
    def doThat(self):
        ...

শ্রেণীর নাম ওভাররাইট করে ক্লাসের একটি উদাহরণ তৈরি করুন:

x = x()

কার্যকারিতা উদ্ভাসিত প্রতীকগুলি সংজ্ঞায়িত করুন:

doThis = x.doThis
doThat = x.doThat

উদাহরণটি নিজেই মুছুন:

del x

এখন আপনার কাছে একটি মডিউল রয়েছে যা কেবলমাত্র আপনার সর্বজনীন কার্যাদি প্রকাশ করে।


2
"শ্রেণীর নাম ওভাররাইটিং" এর উদ্দেশ্য / ক্রিয়াকলাপটি বুঝতে এক মিনিট সময় নিয়েছি, তবে যখন করেছি তখন আমি একটি বড় হাসি পেয়েছি। আমি কখন এটি ব্যবহার করব তা নিশ্চিত নয়। :)
জ্যাচ ইয়ং

এই কৌশলটির কোনও নাম আছে?
বিশ্বাস মিশ্র


4

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

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

এছাড়াও, সর্বসাধারণের প্রত্যেকটির নিজস্ব ভয়াবহ পার্ক রয়েছে, যেমন উদাহরণস্বরূপ, আপনি বাইরে থেকে বেশ কিছু পরীক্ষা করতে পারেন (যা আপনি সি / সি ++ বেসরকারী নির্মাণের সাথে সত্যই করতে পারবেন না)।


4

"ব্যক্তিগত" সনাক্তকারীদের নাম উপসর্গ করতে দুটি আন্ডারস্কোর ব্যবহার করুন। মডিউলটিতে ক্লাসগুলির জন্য, একটি একক শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার করুন এবং সেগুলি "মডিউল আমদানি * থেকে" আমদানি করা হবে না।

class _MyInternalClass:
    def __my_private_method:
        pass

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


দু'জন কেন? একটি যথেষ্ট।
এস .লট

ক্লাস এবং ফাংশন আমদানি থেকে "আমদানি" রোধ করতে একটি একক আন্ডারস্কোর যথেষ্ট। পাইথনের নাম ম্যাংলিং বৈশিষ্ট্যটি প্ররোচিত করতে আপনার দুটি আন্ডারস্কোর প্রয়োজন। আরও পরিষ্কার করা উচিত ছিল; আমি সম্পাদনা করেছি।
ক্রোডার

এখন, ফলোআপ। নাম ম্যাংলিং কেন? এর সম্ভাব্য সুবিধা কী?
এসলট

5
সম্ভব সুবিধা বিরক্তিকর অন্যান্য বিকাশকারীদের ঐ ভেরিয়েবল :) এক্সেস প্রয়োজন
রিচার্ড Levasseur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.