পাইথনে সুস্পষ্ট 'স্ব' এড়ানো কীভাবে?


131

কিছু পাইগাম টিউটোরিয়াল অনুসরণ করে আমি পাইথন শিখছি ।

এর মধ্যে আমি কীওয়ার্ড স্বের বিস্তৃত ব্যবহার খুঁজে পেয়েছি এবং প্রাথমিকভাবে জাভা ব্যাকগ্রাউন্ড থেকে এসেছি যে আমি নিজেই টাইপ করতে ভুলে যাচ্ছি । উদাহরণস্বরূপ, self.rect.centerxআমি পরিবর্তে টাইপ করব rect.centerx, কারণ আমার কাছে, রেক্টর ইতিমধ্যে শ্রেণীর সদস্য ভেরিয়েবল।

জাভা সমান্তরাল আমি এই পরিস্থিতির সঙ্গে সদস্য ভেরিয়েবল সব রেফারেন্স প্রিফিক্স হচ্ছে না মনে করতে পারেন এই

আমি কি নিজের সাথে সমস্ত সদস্যের ভেরিয়েবলের উপসর্গ আটকে রেখেছি , বা তাদের এমন ঘোষণার কোনও উপায় আছে যা আমাকে তা না করে এড়াতে দেয়?

যদিও আমি যা প্রস্তাব করছি তা অজগর নয় , তবে আমি এটি এখনও সম্ভব কিনা তা জানতে চাই।

আমি এই সম্পর্কিত এসও প্রশ্নগুলি একবার দেখেছি, তবে আমি কী পরে তা তারা যথেষ্ট উত্তর দেয় না:


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

4
আপনি কি m_কিছু সি ++ / জাভা প্রোগ্রামারদের দ্বারা পরিপূর্ণ সমস্ত সদস্যের নামগুলির জন্য একটি উপসর্গের কনভেনশনের সাথে পরিচিত ? এর ব্যবহার self.একইভাবে পাঠযোগ্যতার সহায়তা করে। এছাড়াও, আপনি dirtsimple.org/2004/12/python-is-not-java.html পড়তে হবে
বেনি চেরনিয়াভস্কি-পাসকিন

2
যদিও সাধারণত m_অ-সর্বজনীন অ স্থির ডেটা সদস্যদের জন্য ব্যবহৃত হয় (কমপক্ষে সি ++ এ) in

@ বেনি দুর্দান্ত লিঙ্কযুক্ত নিবন্ধ, এবং হ্যাঁ, mVariableNameজাভাতে কোডিংয়ের সময় আমি আসলে সদস্যের ভেরিয়েবলের জন্য ব্যবহারের সম্মেলনটি অনুসরণ করি । আমি মনে করি @ অনুরাগের মন্তব্যটি এটিকে বেশ ভালভাবে জাগিয়ে তুলেছে, অজগর শেখার সময় জাভা দেবের কী করা উচিত for
বুগুইজ

11
সুতরাং, কীভাবে সবাই ওপিকে বলছে যে স্ব ব্যবহার কেন ভাল / প্রয়োজনীয় / ইত্যাদি। তবে কেউ বলে না এটাকে কোনওভাবে এড়ানো যায় কিনা? এমনকি যদি এক ধরণের নোংরা কৌশল দ্বারা?
einpoklum

উত্তর:


99

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

একটি চূড়ান্ত উদাহরণ: আপনি কোন বেস ক্লাসগুলি থাকতে পারে তা সম্পর্কে কোনও জ্ঞান ছাড়াই একটি ক্লাস লিখতে পারেন এবং আপনি কোনও সদস্যের অ্যাক্সেস করছেন কিনা তা সর্বদা জানতে পারবেন:

class A(some_function()):
  def f(self):
    self.member = 42
    self.method()

এটিই সম্পূর্ণ কোড! (কিছু_ ফাংশন বেস হিসাবে ব্যবহৃত টাইপটি প্রদান করে))

অন্যটি, যেখানে শ্রেণীর পদ্ধতিগুলি গতিশীলভাবে রচিত হয়:

class B(object):
  pass

print B()
# <__main__.B object at 0xb7e4082c>

def B_init(self):
  self.answer = 42
def B_str(self):
  return "<The answer is %s.>" % self.answer
# notice these functions require no knowledge of the actual class
# how hard are they to read and realize that "members" are used?

B.__init__ = B_init
B.__str__ = B_str

print B()
# <The answer is 42.>

মনে রাখবেন, এই দুটি উদাহরণই চরম এবং আপনি এটি প্রতিদিন দেখতে পাবেন না বা আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার প্রায়শই এই জাতীয় কোড লেখা উচিত, তবে তারা স্বতঃস্ফূর্তভাবে প্রয়োজনীয়তার দিকটি প্রদর্শন করে।


4
ধন্যবাদ. এই উত্তরটি স্পটকে আঘাত করে এটি ব্যবহারের সুবিধাগুলিও ব্যাখ্যা করে self
bguiz

2
@ রজার পেট: দয়া করে অজগরটি থেকে আমার প্রশ্নটি সম্পাদনা বন্ধ করুন। আমি মনে করি এটি সেখানে। (এবং উত্তরের জন্য ধন্যবাদ!)
বগুইজ

3
@ বিগুইজ: শিরোনামে ট্যাগগুলি নকল না করার পক্ষে এটিই কনভেনশন। যাইহোক, আমি যখন 2 দিন আগে সম্পাদনা করেছি, আমি 7 মাস আগে আপনাকে শিরোনামটি উল্টানো দেখিনি।

1
স্ব-একক চরিত্রে হ্রাস পেতে পারলে এটি দুর্দান্ত হবে।
dwjohnston

5
এটি আসলে একটি বরং নির্বোধ কারণ। পাইথন ছায়ামুখ গ্রহণ করতে ব্যর্থ হতে পারে এবং আপনাকে এটি নির্দিষ্টভাবে ঘোষণা করতে হবে, অর্থাত্ কোনও ধরণের দিয়ে আপনার ছায়ার ক্ষেত্রকে 'আশীর্বাদ করুন' __shadow__ myFieldName। এটি দুর্ঘটনাক্রমে ছায়া রোধ করতে পারে, তাই না?
einpoklum

39

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

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

import numpy as np
class MyFunkyGaussian() :
    def __init__(self, A, x0, w, s, y0) :
        self.A = float(A)
        self.x0 = x0
        self.w = w
        self.y0 = y0
        self.s = s

    # The correct way, but subjectively less readable to some (like me) 
    def calc1(self, x) :
        return (self.A/(self.w*np.sqrt(np.pi))/(1+self.s*self.w**2/2)
                * np.exp( -(x-self.x0)**2/self.w**2)
                * (1+self.s*(x-self.x0)**2) + self.y0 )

    # The correct way if you really don't want to use 'self' in the calculations
    def calc2(self, x) :
        # Explicity copy variables
        A, x0, w, y0, s = self.A, self.x0, self.w, self.y0, self.s
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

    # Probably a bad idea...
    def calc3(self, x) :
        # Automatically copy every class vairable
        for k in self.__dict__ : exec(k+'= self.'+k)
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

g = MyFunkyGaussian(2.0, 1.5, 3.0, 5.0, 0.0)
print(g.calc1(0.5))
print(g.calc2(0.5))
print(g.calc3(0.5))

তৃতীয় উদাহরণ - অর্থাত্‍ ব্যবহারটি for k in self.__dict__ : exec(k+'= self.'+k)হ'ল মূলত যা প্রশ্নটি জিজ্ঞাসা করে তা হ'ল তবে আমাকে পরিষ্কার করে দেওয়া উচিত যে আমি সাধারণত এটি একটি ভাল ধারণা বলে মনে করি না।

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

আপডেট: পাইথন 3-এ কোনও ক্রিয়াকলাপে স্থানীয়দের পরিবর্তনশীল আপডেট বা পরিবর্তন করার কোনও উপায় নেই বলে মনে হয় , সুতরাং ক্যালক 3 এবং অনুরূপ রূপগুলি আর সম্ভব হয় না। আমি এখন যে পাইথন 3 এর সামঞ্জস্যপূর্ণ সমাধানটি ভাবতে পারি তা হ'ল globals:

def calc4(self, x) :
        # Automatically copy every class variable in globals
        globals().update(self.__dict__)
        sqrt, exp, pi = np.sqrt, np.exp, np.pi
        return ( A/( w*sqrt(pi) )/(1+s*w**2/2)
                * exp( -(x-x0)**2/w**2 )
                * (1+s*(x-x0)**2) + y0 )

যা আবার সাধারণভাবে একটি ভয়াবহ অনুশীলন হবে।


4
উজ্জ্বল! এটি সর্বাধিক (কেবল?) সঠিক উত্তর। +1 আপনি অনন্যভাবে এটি করার জন্য ব্যবহারিক কারণও দেন give +1 আই
ডেভিড লটস

একটি শ্রেণী তৈরি করার পরে এবং কোডটির অভ্যন্তরে স্থানান্তরিত করার পরে: এখন সমস্ত পদ্ধতি এবং ভেরিয়েবলগুলি আর স্বীকৃত নয় (কোনও স্ব। ) একটি ধারণা হিসাবে এটি জন্য ধন্যবাদ। এটি সামগ্রিকভাবে সমস্যা / মাথা ব্যাথা / অপঠনযোগ্যতা ঠিক করে না তবে একটি পরিমিত কাজ করে।
জাভাদবা

শুধু localsব্যবহারের পরিবর্তে আপডেট করবেন না কেন exec?
নাথান

আমি locals().update(self.__dict__)অজগর 2 এবং 3 এ চেষ্টা করেছি , তবে এটি কার্যকর হয়নি। পাইথন 3 এ এমনকি 'এক্সিকিউটিভ' ট্রিকটিও বিকল্প নয়। অন্যদিকে, globals().update(self.__dict__)কাজ করে তবে সাধারণভাবে এটি একটি ভয়ানক অনুশীলন হবে।
আরজেন্টাম 2f

26

আসলে selfকোনও কীওয়ার্ড নয়, এটি পাইথনের উদাহরণ পদ্ধতিগুলির প্রথম পরামিতিগুলিতে প্রচলিত নাম মাত্র। এবং সেই প্রথম প্যারামিটারটি এড়ানো যায় না, কারণ এটি একমাত্র পদ্ধতি যা আপনার ক্লাসের কোন উদাহরণটি বলা হচ্ছে তা জেনে থাকার পদ্ধতি has


1
এই উত্তরটি, বিশেষ করে 2nd বাক্য, এ পর্যন্ত অনেক বেশি দরকারী আমার জন্য গৃহীত উত্তর চেয়ে মাত্র পাইথন মধ্যে সীমাবদ্ধতা এক এবং পরিহার্য নয়, কারণ আমি 'স্পষ্ট স্ব' জানতে পারি
QuestionDriven

21

উদাহরণস্বরূপ আপনি যে নামটি চান তা ব্যবহার করতে পারেন

class test(object):
    def function(this, variable):
        this.variable = variable

অথবা এমনকি

class test(object):
    def function(s, variable):
        s.variable = variable

তবে আপনি সুযোগটির জন্য একটি নাম ব্যবহার করে আটকে গেছেন।

আপনার কাছে দৃ conv় বিশ্বাসযোগ্য কারণ না থাকলে আপনি নিজের কাছে আলাদা কিছু ব্যবহার করার পরামর্শ দিচ্ছি না, কারণ এটি অভিজ্ঞ পাইথনিস্টাসের জন্য এটি এলিয়েন করে তুলবে।


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

3
আরও ভিনগ্রহের:def function(_, variable): _.variable = variable
বব স্টেইন

1
@ ববস্টাইন-ভিসিবিওন আরও বেশি ভিনগ্রহের:def funcion(*args): args[0].variable = args[1]
অ্যামিল

4
@ ধীরে ধীরে তিনি এটি প্রস্তাব দিচ্ছেন না, আমার মতো লোকদের জন্য এই তথ্যটি খুব সহায়ক who
সোভেন ভ্যান ডেন বুগার্ট

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

9

হ্যাঁ, আপনাকে সর্বদা উল্লেখ করতে হবে self, কারণ অজগর দর্শনের মতে সুস্পষ্ট বর্ণনাকারীর চেয়ে ভাল।

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

যাইহোক আমি প্রথমে এটি ঘৃণা করি, এখন আমি বিপরীতকে ঘৃণা করি। ইন্টেন্টেড চালিত প্রবাহ নিয়ন্ত্রণের জন্য একই।


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

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

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

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

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

4

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

class UserAccount():    
    def __init__(self, user_type, username, password):
        self.user_type = user_type
        self.username = username            
        self.password = encrypt(password)        

    def get_password(self):
        return decrypt(self.password)

    def set_password(self, password):
        self.password = encrypt(password)

এখন আমরা 'স্ব' এর সাথে 'এর' প্রতিস্থাপন করব:

class UserAccount():    
    def __init__(its, user_type, username, password):
        its.user_type = user_type
        its.username = username            
        its.password = encrypt(password)        

    def get_password(its):
        return decrypt(its.password)

    def set_password(its, password):
        its.password = encrypt(password)

কোনটি এখন বেশি পঠনযোগ্য?


কেন কেবল s(বা অন্য কোনও একক চিঠি) পরিবর্তে নাits
জাভাদ্ব্বা

'এর' এর একটি অর্থ আছে এবং 'গুলি' তা নয়।
লেবুউল অ্যাডান

sএকই অর্থ রয়েছে: শ্রেণীর উদাহরণের জন্য একটি উপাধি। আমি itsপ্রসঙ্গে ঠিক একই অর্থ কী তা সন্ধান করতে চাই
জাভাদ্ব্বা

দুটোই আমার কাছে পঠনযোগ্য নয়। বাহ্যিক প্যারামিটার হিসাবে "নিজেকে" পাওয়া এখনও অযৌক্তিক, এটি কোনও ধারণা দেয় না।
সিজার

3

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


2
স্ব হ'ল উপায় না ব্যবহার করে অ্যাক্সেস মডিফায়ারটিকে সত্যই বলা যায়। +1
পেরেপ্যুয়ালকোডার

1

আসলে আপনি আর্মিন রোনাচার উপস্থাপনা "" খারাপ ধারণা 5 বছর "(গুগল এটি) থেকে" নিখুঁত স্ব "রেসিপিটি ব্যবহার করতে পারেন।

এটি খুব চালাক রেসিপি, আর্মিন রোনাচারের প্রায় সবকিছু হিসাবে, তবে আমি মনে করি না যে এই ধারণাটি খুব আকর্ষণীয়। আমি স্পষ্ট পছন্দ এই সি # / জাভা।

হালনাগাদ. "খারাপ ধারণা রেসিপি" - এর লিঙ্ক: https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58


কি এই লিঙ্কে কি আপনি আপনি উল্লেখ করা হয় উল্লেখ করা হয়? যদি দয়া করে আপনার উত্তরে অন্তর্ভুক্ত থাকে
রূবেজনজান

না, আমার স্বাদের জন্য আরমিন "খারাপ ধারণা" আরও মজাদার দেখাচ্ছে। আমি লিঙ্ক অন্তর্ভুক্ত।
অ্যালেক্স ইউ

আপনি রেসিপি লিঙ্কটিতে ক্লিক করার আগে নোট করুন যে এটি def method(<ডেল> স্ব </ del> )পরামিতি তালিকায় self.variableএটি অন্তর্ভুক্ত করে তবে এখনও এই চালাক হ্যাকের সাথে প্রয়োজনীয়।
ডেভিড লটস

0

হ্যাঁ, স্ব-ক্লান্তিকর। তবে, এটা কি আরও ভাল?

class Test:

    def __init__(_):
        _.test = 'test'

    def run(_):
        print _.test

10
_পাইথন শেলটির বিশেষ অর্থ রয়েছে, যেখানে এটি সর্বশেষ ফেরত মান রাখে। এটি এটির মতো ব্যবহার করা নিরাপদ তবে সম্ভাব্য বিভ্রান্তিমূলক; আমি এড়াতে চাই।
কেয়ারনারভন

না এটি আরও ভাল নয় তবে তার পরিবর্তে একটি অক্ষর নয় কেন উদাহরণস্বরূপ sবা m(সি ++ অনুকরণ করার জন্য)
জাভাদ্ব্বায়

0

থেকে: স্ব নরক - আরও রাষ্ট্রীয় কার্য functions

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


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

0

আমি মনে করি যে "গ্লোবাল" আছে ঠিক তেমন একটি সদস্য "সদস্য" থাকলে একটি বিবৃতি থাকলে এটি সহজ এবং আরও পঠনযোগ্য হবে যাতে আপনি দোভাষীকে বলতে পারেন যে ক্লাসের অবজেক্টের সদস্য যারা রয়েছে।

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