পাইথন ক্লাসে "ব্যক্তিগত" ভেরিয়েবল আছে?


578

আমি জাভা বিশ্ব থেকে আসছি এবং ব্রুস একেলস এর পাইথন 3 প্যাটার্নস, রেসিপি এবং আইডিয়ামস পড়ছি ।

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

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

class Simple:
    def __init__(self, s):
        print("inside the simple constructor")
        self.s = s

    def show(self):
        print(self.s)

    def showMsg(self, msg):
        print(msg + ':', self.show())

যদি এটি সত্য হয় তবে শ্রেণীর যে কোনও অবজেক্ট ক্লাসের বাইরে Simpleভেরিয়েবলের মান পরিবর্তন করতে পারে s

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

if __name__ == "__main__":
    x = Simple("constructor argument")
    x.s = "test15" # this changes the value
    x.show()
    x.showMsg("A message")

জাভাতে, আমরা সরকারী / ব্যক্তিগত / সুরক্ষিত ভেরিয়েবল সম্পর্কে শিখিয়েছি। এই কীওয়ার্ডগুলি বোধগম্য হয় কারণ সময়ে সময়ে আপনি এমন শ্রেণিতে ভেরিয়েবল চান যেখানে ক্লাসের বাইরে কারও অ্যাক্সেস থাকে না।

পাইথনে কেন এটি প্রয়োজন হয় না?


17
আপনি উদাহরণ ভেরিয়েবল বলতে চেয়েছিলেন , ক্লাস ভেরিয়েবল নয়, তাই না ?
PaulMcG

13
আপনার বৈশিষ্ট্যগুলি পরীক্ষা করা উচিত: ডকস.পাইথন.আর / লাইবারি / ফাংশনস html# প্রপার্টি । কেবল গেটর ব্যবহার করুন এবং আপনার পরিবর্তনশীল সুরক্ষিত হবে।
রুবিক

একটি সংক্ষিপ্ত এবং খাস্তা উত্তর এখানে । আমি আশা করি এটি সাহায্য করবে
প্রেমকুমার ছলমেটি

উত্তর:


961

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

আপনি যদি কোনও কারণে ব্যক্তিগত ভেরিয়েবলগুলি অনুকরণ করতে চান তবে আপনি সর্বদা পিইপি 8__ থেকে উপসর্গটি ব্যবহার করতে পারেন । পাইথন mangle করা ভেরিয়েবল নাম পছন্দ যাতে তারা বর্গ যে তাদের যদিও আপনি ধারণ করে (বাহিরে কোডে সহজে দৃশ্যমান না হন পারেন যদি তুমি নির্ধারিত যথেষ্ট এটি প্রায় পেতে, ঠিক মত আপনি করতে পারেন যদি আপনি এটি কাজ জাভার নিরাপত্তা কাছাকাছি পেতে )।__foo

একই সম্মেলনের মাধ্যমে, _উপসর্গটির অর্থ আপনি প্রযুক্তিগতভাবে তা করা থেকে বিরত না থাকলেও দূরে থাকুন । আপনি অন্য শ্রেণীর ভেরিয়েবলগুলির মতো দেখতে __fooবা খেলেন না _bar


14
এটা বোধগম্য. তবে আমি মনে করি না যে জাভাতে ক্লাসের বাইরে প্রাইভেট ভেরিয়েবলগুলি অ্যাক্সেস করার কোনও উপায় আছে (আসলে ক্লাসের উত্সের উত্সটি পরিবর্তন করা ব্যতীত)। আছে?
সর্বব্যাপী

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

67
@ সর্বব্যাপী, আপনি প্রতিবিম্ব ব্যবহার করতে পারেন।
রাপাদুরা

76
আমাকে এটি সোজা পেতে দাও, সুতরাং পাইথন জনসাধারণ বা ব্যক্তিগত বৈশিষ্ট্যগুলি প্রয়োগ করে না কারণ "এটি সুরক্ষার ভান করে এবং প্রোগ্রামারদেরকে দায়বদ্ধ হতে উত্সাহিত করে", তবে সম্প্রদায়টি ব্যক্তিগত ভেরিয়েবল এবং পদ্ধতিগুলি বোঝাতে "_" ব্যবহারকে উত্সাহ দেয়? হয়তো অজগরটির সংজ্ঞামূলকভাবে সরকারী ও বেসরকারী নম্বর থাকতে হবে? শ্রেণীর সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার কোন API ব্যবহার করা উচিত তা আপনাকে জানানো তাদের মূল উদ্দেশ্য। তারা আপনাকে এই পদ্ধতিগুলি ব্যবহার করতে এবং সেগুলি ব্যবহার না করার জন্য ডকুমেন্টেশন হিসাবে কাজ করে। এগুলি কোনও "সুরক্ষার ভান" নয়, তারা এপিআই ডকুমেন্টেশন, যা আপনাকে গাইড করতে আইডিই ব্যবহার করতে পারে!
পেড্রোড

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

159

পাইথনে প্রাইভেট ভেরিয়েবল কম-বেশি হ্যাক হয়: দোভাষী দানবীয়ভাবে ভেরিয়েবলটির নতুন নামকরণ করেন।

class A:
    def __init__(self):
        self.__var = 123
    def printVar(self):
        print self.__var

এখন, আপনি যদি __varশ্রেণীর সংজ্ঞার বাইরে অ্যাক্সেস করার চেষ্টা করেন তবে এটি ব্যর্থ হবে:

 >>>x = A()
 >>>x.__var # this will return error: "A has no attribute __var"

 >>>x.printVar() # this gives back 123

তবে আপনি সহজেই এ থেকে পালাতে পারবেন:

 >>>x.__dict__ # this will show everything that is contained in object x
               # which in this case is something like {'_A__var' : 123}

 >>>x._A__var = 456 # you now know the masked name of private variables
 >>>x.printVar() # this gives back 456

আপনি সম্ভবত জানেন যে ওওপিতে পদ্ধতিগুলি এই জাতীয়ভাবে আহ্বান করা হয়:, x.printVar() => A.printVar(x)যদি A.printVar()কিছু ক্ষেত্রে প্রবেশ xকরতে পারে তবে এই ক্ষেত্রটি বাইরেও প্রবেশ করা যেতে পারে A.printVar()... সর্বোপরি, পুনরায় ব্যবহারের জন্য ফাংশন তৈরি করা হয়, ভিতরে বিবৃতিগুলিতে কোনও বিশেষ ক্ষমতা দেওয়া হয় না।

কোনও কম্পাইলার জড়িত থাকার সময় গেমটি আলাদা হয় ( গোপনীয়তা একটি সংকলক স্তরের ধারণা )। এটি অ্যাক্সেস নিয়ন্ত্রণ সংশোধকগুলির সাথে শ্রেণীর সংজ্ঞা সম্পর্কে জানে তাই নিয়মগুলি সংকলনের সময় অনুসরণ না করা হলে এটি ত্রুটিযুক্ত হতে পারে


3
সংক্ষেপে, এটি encapsulation নয়
वाटশী শান

2
আমি ভাবছি যে পিএইচপি এর বোকা বেসরকারী ভেরিয়েবলগুলির সাথে কিছু মিল রয়েছে - যেহেতু ব্যক্তিগত ভেরিয়েবলগুলি ব্যাখ্যা করা ভাষায় সত্যিকার অর্থে বোঝায় না - আমি বোঝাতে চাইছি যে এটি কী সংশোধন করা হয়নি তা এক্স ভেরিয়েবলটি প্রাইভেট কিনা?
NoBugs

1
কীভাবে আমরা ব্যক্তিগত ভেরিয়েবলগুলির প্যাটার্নটি এলোমেলো করে তুলতে পারি?
ক্রিস্রন

@ ক্রিস্রন একই প্রশ্ন
ইয়ানএস

5
সংক্ষেপে @watashiSHUN "এটি encapsulation নয়" => হ্যাঁ। এনক্যাপসুলেশনটি কেবলমাত্র পাবলিক এপিআই ব্যবহার করার বিষয়ে তাই ক্লায়েন্ট কোডটি প্রয়োগের পরিবর্তনগুলি থেকে সুরক্ষিত থাকে। নামকরণের কনভেনশনগুলি এপিআই কী এবং বাস্তবায়ন কী তা বলার একটি সঠিক বৈধ উপায় এবং মূল বিষয়টি এটি কেবল কার্যকর।
ব্রুনো desthuilliers

30

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


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

18

আন্ডারস্কোর কনভেনশনে প্রাইভেট ভেরিয়েবলের বিভিন্নতা রয়েছে।

In [5]: class Test(object):
   ...:     def __private_method(self):
   ...:         return "Boo"
   ...:     def public_method(self):
   ...:         return self.__private_method()
   ...:     

In [6]: x = Test()

In [7]: x.public_method()
Out[7]: 'Boo'

In [8]: x.__private_method()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-fa17ce05d8bc> in <module>()
----> 1 x.__private_method()

AttributeError: 'Test' object has no attribute '__private_method'

কিছু সূক্ষ্ম পার্থক্য রয়েছে, তবে প্রোগ্রামিং প্যাটার্ন আদর্শিক বিশুদ্ধতার জন্য, এটি যথেষ্ট ভাল।

@ ব্যক্তিগত সাজসজ্জারের উদাহরণ রয়েছে যা ধারণাটি আরও ঘনিষ্ঠভাবে প্রয়োগ করে, তবে ওয়াইএমএমভি। নিঃসন্দেহে কেউ মেটা ব্যবহার করে এমন একটি শ্রেণীর সংজ্ঞাও লিখতে পারে


14
আমি বুঝতে পারছি যে পার্টিতে দেরি হয়ে গেছে তবে সমস্যাটি গুগল করার সময় এই লিঙ্কটি গুগলে প্রদর্শিত হবে shows এটি পুরো গল্পটি বলে না। __xশ্রেণীর অভ্যন্তরে কোনও পরিবর্তনশীল Aআসলে সংকলক দ্বারা পুনরায় লেখা হয় _A__x, এটি এখনও সম্পূর্ণ ব্যক্তিগত নয় এবং এখনও অ্যাক্সেস করা যেতে পারে।
জোর্ফ

1
অবশ্যই, যদি আমি নামের একটি ভেরিয়েবল দেখতে পাই তবে আমি _A__xএটি স্পর্শ করব না। এটি সংক্রামক হতে পারে। আমি এ থেকে দূরে দৌড়াব।
মতিন উলহাক

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

14

"জাভাতে, আমরা সরকারী / ব্যক্তিগত / সুরক্ষিত ভেরিয়েবল সম্পর্কে শিখিয়েছি"

"অজগর কেন এটি প্রয়োজন হয় না?"

একই কারণে, জাভাতে এটি প্রয়োজন হয় না ।

আপনি ব্যবহার করতে পারবেন - বা না ব্যবহার করুন privateএবং protected

পাইথন এবং জাভা প্রোগ্রামার হিসাবে, আমি এটি পেয়েছি privateএবং protectedখুব গুরুত্বপূর্ণ ডিজাইনের ধারণা con তবে একটি ব্যবহারিক বিষয় হিসাবে, জাভা এবং পাইথনের কয়েক হাজার লাইনে আমি বাস্তবে কখনও ব্যবহার করি নি privateবা protected

কেন না?

এখানে আমার প্রশ্নটি "কার কাছ থেকে সুরক্ষিত?"

আমার দলের অন্যান্য প্রোগ্রামাররা? তাদের উত্স আছে। সুরক্ষিত বলতে কী বোঝায় যখন তারা এটিকে পরিবর্তন করতে পারে?

অন্যান্য দলের অন্যান্য প্রোগ্রামাররা? তারা একই সংস্থার হয়ে কাজ করে। তারা - একটি ফোন কল দিয়ে উত্স পেতে পারে।

ক্লায়েন্টদের মধ্যে? এটি কাজের জন্য ভাড়ার প্রোগ্রামিং (সাধারণত)। ক্লায়েন্টদের (সাধারণত) কোডটির মালিকানা থাকে।

সুতরাং, কে - অবিকল - আমি এ থেকে রক্ষা করছি?


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

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

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

38
@ এসলট আমি অজগর লোক নই, তাই আমি সেই দৃষ্টিকোণ থেকে মন্তব্য করব না। তবে জাভা বিকাশকারী হিসাবে এটি সত্যই ভীতিজনক পরামর্শ। -1
dbyrne

11
কি দারুন. আপনি বিন্দুটি পুরোপুরি মিস করেছেন, আপনি খুব খারাপ পরামর্শ দিয়েছেন, আপনি যে কেউ এই বিষয়ে আপনার সাথে একমত নন, আপনি অপমান করেছেন কিন্তু আপনি এখনও এই "উত্তর "টির জন্য ব্যাজ এবং 1000 এরও বেশি খ্যাতি পয়েন্ট পেয়েছেন।
এরিক ডুমিনিল

12

পূর্বে উল্লিখিত হিসাবে, আপনি একটি পরিবর্তনশীল বা পদ্ধতিটি আন্ডারস্কোর দিয়ে উপসর্গ করে ব্যক্তিগত বলে ইঙ্গিত দিতে পারেন। আপনি যদি এটি যথেষ্ট মনে করেন না তবে আপনি সর্বদা propertyসাজসজ্জার ব্যবহার করতে পারেন । এখানে একটি উদাহরণ:

class Foo:

    def __init__(self, bar):
        self._bar = bar

    @property
    def bar(self):
        """Getter for '_bar'."""
        return self._bar

এইভাবে, কেউ বা এমন কিছু যা উল্লেখযোগ্যভাবে barআসলে barভেরিয়েবলের পরিবর্তে ফাংশনের রিটার্ন মান উল্লেখ করে এবং তাই এটি অ্যাক্সেস করা যায় তবে পরিবর্তন করা যায় না। তবে, যদি সত্যিই কেউ চান, তারা কেবল এটি ব্যবহার _barকরে এটিতে একটি নতুন মান নির্ধারণ করতে পারে। বারবার বলা হয়েছে, আপনি যেগুলি ভেরিয়েবল এবং পদ্ধতিগুলি লুকাতে চান সেগুলি অ্যাক্সেস করা থেকে বিরত রাখার কোনও নিশ্চিত উপায় নেই। তবে, propertyব্যবহারটি হ'ল পরিষ্কার বার্তাটি আপনি প্রেরণ করতে পারেন যে কোনও ভেরিয়েবলটি সম্পাদনা করা উচিত নয়। propertyএখানে বর্ণিত হিসাবে আরও জটিল গিটার / সেটার / ডিলেটর অ্যাক্সেস পাথগুলির জন্যও ব্যবহার করা যেতে পারে: https://docs.python.org/3/library/funitions.html#poperty


জ্যাঙ্গোও এর প্রশংসা করে।
babygame0ver

10

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

সে সম্পর্কে আরও জানতে এখানে দেখুন ।

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


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

8

ভেরিয়েবল থেকে লেখার সময় বা পড়ার সময় যখন আমাকে অন্যান্য জিনিসগুলি করা দরকার তখন যেমন আমি কেবল বেসরকারী ভেরিয়েবলগুলি ব্যবহার করি তখনই আমাকে সেটার এবং / বা গেটর ব্যবহার বাধ্য করতে হয়।

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

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

সুতরাং আমার উত্তর হল; আপনি এবং আপনার সহকর্মীরা যদি একটি সাধারণ কোড সেট বজায় রাখেন তবে শ্রেণি ভেরিয়েবলগুলি সুরক্ষিত করা সর্বদা প্রয়োজন হয় না। আপনি যদি কোনও এক্সটেনসিবল সিস্টেম লিখছেন তবে কোডটি ব্যবহার করে সমস্ত এক্সটেনশান দ্বারা ধরা হওয়া দরকার হলে কোরটিতে পরিবর্তনগুলি করা যখন জরুরি হয় তখন তা আবশ্যক হয়ে ওঠে।


7

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

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

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


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

আমার দৃ further়তা আরও একটি কোডিং হাইজিন দৃষ্টিকোণটি আশঙ্কা করুন, হ্যাঁ এটি এনক্যাপসুলেশনের জন্য গুরুত্বপূর্ণ, তবে এটির জন্য এটি প্রয়োজনীয় নয় এবং তাই @ ব্যক্তিগত (ইত্যাদি) সজ্জিতগুলি কোনও কিছুর চেয়ে বেশি পরামর্শদাতা, তবে ব্যক্তিগত / পাবলিক হিসাবে কোনওটিতে অপ্টিমাইজেশনে দরকারী কিছু যোগ করে না অ স্থির ভাষা, এটি কোনও গভীর স্তরে যেমন জাভা বা সি এর মতো সংকলিত ভাষায় প্রয়োগ করা হয় না
শায়নে

7

দুঃখিত থ্রেডটি "পুনরুত্থিত" করার জন্য, তবে, আমি আশা করি এটি কারওর পক্ষে সহায়তা করবে:

পাইথন 3-তে আপনি জাভা-র মতো ক্লাসের বৈশিষ্ট্যগুলি কেবল "encapsulate" করতে চান তবে আপনি ঠিক একই জিনিসটি করতে পারেন:

class Simple:
    def __init__(self, str):
        print("inside the simple constructor")
        self.__s = str

    def show(self):
        print(self.__s)

    def showMsg(self, msg):
        print(msg + ':', self.show())

এটি করার জন্য ইনস্ট্যান্ট করুন:

ss = Simple("lol")
ss.show()

নোট করুন: print(ss.__s)একটি ত্রুটি নিক্ষেপ করবে।

অনুশীলনে, পাইথন 3 গ্লোবাল অ্যাট্রিবিউট নামটি অস্পষ্ট করবে। এটিকে জাভায় যেমন "বেসরকারী" বৈশিষ্ট্যের মতো ঘুরিয়ে দেওয়া Turn বৈশিষ্ট্যটির নামটি এখনও বিশ্বব্যাপী, তবে অ্যাক্সেসযোগ্য উপায়ে অন্যান্য ভাষার ব্যক্তিগত বৈশিষ্ট্যের মতো।

তবে এতে ভয় পাবেন না। এটা কোন ব্যাপার না। এটি কাজটিও করে। ;)


2
পাইথন 1.5 1.5 আইআইআরসি থেকে এটি বিদ্যমান আছে এবং এটি এখনও এটির ম্যাংলেড নামের মাধ্যমে বৈশিষ্ট্যটি অ্যাক্সেস করতে বাধা দেয় না।
ব্রুনো desthuilliers

4

পাইথনে সি ++ বা জাভা-র মতো কোনও ব্যক্তিগত ভেরিয়েবল নেই। আপনি চাইলে যে কোনও সময় যে কোনও সদস্যের ভেরিয়েবল অ্যাক্সেস করতে পারেন। তবে পাইথনে আপনার ব্যক্তিগত ভেরিয়েবলের দরকার নেই, কারণ পাইথনে আপনার ক্লাসের সদস্য ভেরিয়েবলগুলি প্রকাশ করা খারাপ নয়। আপনার যদি কোনও সদস্যের ভেরিয়েবল এনপ্যাপুলেট করার প্রয়োজন হয় তবে আপনি বিদ্যমান ক্লায়েন্ট কোডটি ভঙ্গ না করে পরে "@ প্রপার্টি" ব্যবহার করে এটি করতে পারেন।

অজগরটিতে একক আন্ডারস্কোর "_" ইঙ্গিত করার জন্য ব্যবহৃত হয় যে কোনও পদ্ধতি বা পরিবর্তনশীল কোনও শ্রেণীর পাবলিক এপি-র অংশ হিসাবে বিবেচিত হয় না এবং এপিআইয়ের এই অংশটি বিভিন্ন সংস্করণের মধ্যে পরিবর্তিত হতে পারে। আপনি এই পদ্ধতিগুলি / ভেরিয়েবলগুলি ব্যবহার করতে পারেন তবে আপনি যদি এই শ্রেণীর একটি নতুন সংস্করণ ব্যবহার করেন তবে আপনার কোডটি ভেঙে যেতে পারে।

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

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

class A(object):
    def __init__(self):
        self.__foobar = None # will be automatically mangled to self._A__foobar

class B(A):
    def __init__(self):
        self.__foobar = 1 # will be automatically mangled to self._B__foobar

স্ব .__ ফুবারের নামটি স্বয়ংক্রিয়ভাবে স্ব - Aএ_ফুবারে ক্লাস এ A. সুতরাং প্রতিটি সাবক্লাস তার পিতামাতার ভেরিয়েবল (গুলি) কে ওভাররাইড না করেই তার নিজস্ব ভেরিয়েবল __foobar সংজ্ঞায়িত করতে পারে। তবে কিছুই আপনাকে ডাবল আন্ডারস্কোর দিয়ে শুরু করে ভেরিয়েবল অ্যাক্সেস করতে বাধা দেয় না। তবে নাম-ম্যাংলিং আপনাকে ঘটনাক্রমে এই পরিবর্তনগুলি / পদ্ধতিগুলি কল করতে বাধা দেয়।

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


আমি সেই আলোচনাটি যাচ্ছি। @propertyজিনিসটি কি স্ট্যান্ডার্ড পাইথনের অংশ, বা এটি কোনও আইডিইর সাথে নির্দিষ্ট?
bballdave025

পাইথন ২.6 থেকে মানটির এটির অংশ। যদি আপনার কোনও পুরানো সংস্করণ ব্যবহার করা উচিত তবে property
বিল্টিন

0

আসলে আপনি C#এই সহজ কৌশলটি ব্যবহার করে একটি গেটর এবং সেটার সিমুলেট করতে পারেন :

class Screen(object):

    def getter_setter_y(self, y, get=True):
        if get is True:
            Screen.getter_setter_y.value = y
        else:
            return Screen.getter_setter_y.value

     def getter_setter_x(self, x, get=True):
         if get is True:
             Screen.getter_setter_x.value = x
         else:
             return Screen.getter_setter_x.value

তারপরে এটি এর মতোই ব্যবহার করুন C#:

scr = Screen()
scr.getter_setter_x(100)
value =  scr.getter_setter_x(0, get=False)
print (value)

এটি কেবল কোনও ফাংশনে স্থিতিশীল স্থানীয় ভেরিয়েবলের ঘোষণা দিচ্ছে যা একটি গেই / সেট ভূমিকা পালন করবে, কারণ এটি কোনও শ্রেণি বা ফাইলের জন্য বৈশ্বিক না করে গেট এবং সেট পদ্ধতিগুলির মাধ্যমে কোনও ভেরিয়েবল ভাগ করার একমাত্র উপায়।

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