পাইথন ক্লাসে আমরা __init__ কেন ব্যবহার করব?


124

ক্লাসগুলির সূচনা বুঝতে আমার সমস্যা হচ্ছে।

তাদের মূল বিষয় কী এবং কীভাবে আমরা তাদের মধ্যে অন্তর্ভুক্ত করব তা জানব? ক্লাসে লেখার জন্য ফাংশন তৈরির বিপরীতে আলাদা ধরণের চিন্তাভাবনা প্রয়োজন (আমি অনুভব করেছি যে আমি কেবল ফাংশন তৈরি করতে পারি এবং তারপরে কেবল সেগুলি একটি ক্লাসে আবদ্ধ করতে পারি যাতে আমি সেগুলি পুনরায় ব্যবহার করতে পারি that কাজটি কি কাজ করবে?)

এখানে একটি উদাহরণ:

class crawler:
  # Initialize the crawler with the name of database
  def __init__(self,dbname):
    self.con=sqlite.connect(dbname)

  def __del__(self):
    self.con.close()

  def dbcommit(self):
    self.con.commit()

বা অন্য কোড নমুনা:

class bicluster:
  def __init__(self,vec,left=None,right=None,distance=0.0,id=None):
    self.left=left
    self.right=right
    self.vec=vec
    self.id=id
    self.distance=distance

__init__অন্যান্য লোকের কোড পড়ার চেষ্টা করার সাথে সাথে আমি প্রচুর ক্লাস নিয়ে এসেছি তবে সেগুলি তৈরি করার যুক্তিটি আমি বুঝতে পারি না।


1
থিমের গল্পটি হ'ল ... ব্লা, ব্লা, ব্লা .... কনস্ট্রাক্টর-ডেস্ট্রাক্টর তবে কোনও ডেস্ট্রাক্টর নেই কারণ আবর্জনা সংগ্রহের ব্যবস্থা রয়েছে।
মিস্টারজিইকি

উত্তর:


289

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

যখন তুমি বললে

class Dog:
    def __init__(self, legs, colour):
        self.legs = legs
        self.colour = colour

fido = Dog(4, "brown")
spot = Dog(3, "mostly yellow")

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

তবে খেয়াল করুন যে আপনি সেট করেননি colour নিজেই ডগডের জন্য করেন নি - এটি একটি বিমূর্ত ধারণা। ক্লাসগুলি বোঝায় এমন বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, population_sizeএটি একটি - এটি ফিদো গণনা করার কোনও মানে নেই কারণ ফিদো সর্বদা এক থাকে। এটি কুকুর গণনা করার কোন মানে নেই। আমাদের বলুন যে বিশ্বে 200 মিলিয়ন কুকুর রয়েছে। এটি কুকুর শ্রেণীর সম্পত্তি। ফিডোর 200 মিলিয়ন সংখ্যার কোনও সম্পর্ক নেই, না স্পটও রয়েছে। এটিকে একটি "শ্রেণীর বৈশিষ্ট্য" বলা হয়, যেমন "উদাহরণ বৈশিষ্ট্যগুলি" এর বিপরীতে colourবা legsতারও বেশি।

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

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

সুতরাং, পূর্ণসংখ্যা একটি বর্গ। তাদের কিছু ডেটা (মান) এবং কিছু আচরণ রয়েছে ("আমাকে এই অন্যান্য সংখ্যাতে যুক্ত করুন")। আসুন এটি দেখান:

class MyInteger:
    def __init__(self, newvalue)
        # imagine self as an index card.
        # under the heading of "value", we will write
        # the contents of the variable newvalue.
        self.value = newvalue
    def add(self, other):
        # when an integer wants to add itself to another integer,
        # we'll take their values and add them together,
        # then make a new integer with the result value.
        return MyInteger(self.value + other.value)

three = MyInteger(3)
# three now contains an object of class MyInteger
# three.value is now 3
five = MyInteger(5)
# five now contains an object of class MyInteger
# five.value is now 5
eight = three.add(five)
# here, we invoked the three's behaviour of adding another integer
# now, eight.value is three.value + five.value = 3 + 5 = 8
print eight.value
# ==> 8

এটি কিছুটা নাজুক (আমরা ধরে otherনিচ্ছি যে এটি একটি মাইইন্টেইজার হবে) তবে আমরা এখন এড়িয়ে যাব। বাস্তব কোডে, আমরা না করতাম; আমরা এটি নিশ্চিত করার জন্য এটি পরীক্ষা করব এবং সম্ভবত এটি জোর করেও ("আপনি কোনও পূর্ণসংখ্যক নন? গলির দ্বারা, আপনার এক হয়ে যাওয়ার জন্য 10 ন্যানোসেকেন্ড রয়েছে! 9 ... 8 ....")

আমরা ভগ্নাংশও সংজ্ঞায়িত করতে পারি। ভগ্নাংশগুলি কীভাবে নিজেকে যুক্ত করতে জানে know

class MyFraction:
    def __init__(self, newnumerator, newdenominator)
        self.numerator = newnumerator
        self.denominator = newdenominator
        # because every fraction is described by these two things
    def add(self, other):
        newdenominator = self.denominator * other.denominator
        newnumerator = self.numerator * other.denominator + self.denominator * other.numerator
        return MyFraction(newnumerator, newdenominator)

পূর্ণসংখ্যার চেয়ে আরও বেশি ভগ্নাংশ রয়েছে (আসলে তা নয়, তবে কম্পিউটারগুলি এটি জানে না)। আসুন দুটি করা যাক:

half = MyFraction(1, 2)
third = MyFraction(1, 3)
five_sixths = half.add(third)
print five_sixths.numerator
# ==> 5
print five_sixths.denominator
# ==> 6

আপনি এখানে আসলে কিছু ঘোষণা করছেন না। বৈশিষ্ট্যগুলি নতুন ধরণের পরিবর্তনশীলের মতো। সাধারণ ভেরিয়েবলের কেবল একটি মান থাকে। আমাদের লিখুন আপনি লিখুন colour = "grey"। আপনি নামে অন্য পরিবর্তনশীল থাকতে পারে না colourযে "fuchsia"কোডে একই জায়গায় না -।

অ্যারে এটি একটি ডিগ্রি সমাধান করে। যদি আপনি বলেন colour = ["grey", "fuchsia"], আপনি ভেরিয়েবলের মধ্যে দুটি রঙ সজ্জিত করেছেন, তবে আপনি তাদের অবস্থান (0, বা 1, এই ক্ষেত্রে) দ্বারা আলাদা করতে পারেন।

বৈশিষ্ট্যগুলি ভেরিয়েবল যা কোনও বস্তুর সাথে আবদ্ধ। অ্যারেগুলির মতো, আমাদেরও বিভিন্ন কুকুরের জন্য প্রচুর পরিমাণে colourভেরিয়েবল থাকতে পারে । সুতরাং, একটি পরিবর্তনশীল, কিন্তু অন্য। প্রথমটি ভেরিয়েবলের মধ্যে অবজেক্টের সাথে আবদ্ধ ; দ্বিতীয় ,। এখন, আপনি যখন কল করবেন বা , সেখানে সর্বদা একটি অদৃশ্য প্যারামিটার থাকবে, যা প্যারামিটার তালিকার সামনের অংশে অতিরিক্ত ঝুঁকতে দেওয়া হবে। এটি প্রচলিতভাবে বলা হয় এবং এটি বিন্দুর সামনে বস্তুর মান পাবে। সুতরাং, কুকুরের (কনস্ট্রাক্টর) এর মধ্যে নতুন কুকুরটি যা হবে তা হবে; মধ্যে এর , পরিবর্তনশীল বস্তুর বাধ্য করা হবেfido.colourspot.colourfidospotDog(4, "brown")three.add(five)self__init__selfMyIntegeraddselfthree । সুতরাং,three.valueএর মধ্যে addযেমন একই পরিবর্তনশীল হবে ।self.valueadd

যদি আমি বলি the_mangy_one = fido, আমি fidoঅন্য কোনও নাম হিসাবে পরিচিত অবজেক্টটির উল্লেখ শুরু করব । এখন থেকে fido.colourঠিক একই পরিবর্তনশীল the_mangy_one.colour

সুতরাং, জিনিস ভিতরে __init__। আপনি তাদের কুকুরের জন্ম শংসাপত্রের মধ্যে জিনিসগুলি লক্ষ্য করা হিসাবে ভাবতে পারেন। colourনিজেই একটি এলোমেলো পরিবর্তনশীল, কিছু থাকতে পারে। fido.colourবা self.colourকুকুরের পরিচয় পত্রকে ফর্ম ক্ষেত্রের মতো; এবং __init__কেরানী কি প্রথমবার এটি পূরণ করছে?

কোন পরিষ্কার?

সম্পাদনা : নীচের মন্তব্যে সম্প্রসারণ:

তুমি বলতে চাইছ বস্তুর একটি তালিকা , তাই না?

প্রথমত, fidoআসলে কোনও বস্তু নয়। এটি একটি চলক, যা বর্তমানে কোনও বস্তু ধারণ করে ঠিক যেমনটি আপনি বলছেন x = 5, xবর্তমানে পাঁচটি সংখ্যাযুক্ত একটি ভেরিয়েবল। যদি আপনি পরে নিজের মতামত পরিবর্তন করেন তবে আপনি এটি করতে পারবেন fido = Cat(4, "pleasing")(যতক্ষণ না আপনি একটি শ্রেণি তৈরি করেছেন Cat), এবং fidoতারপরে থেকে একটি বিড়ালের কোনও বস্তু "ধারণ" করতে পারে। আপনি যদি fido = xএটি করেন তবে এটিতে পাঁচ নম্বর থাকবে, এবং কোনও প্রাণীর কোনও বস্তু থাকবে না।

কোনও শ্রেণি নিজেই এর দৃষ্টান্তগুলি জানে না আপনি যদি না নির্দিষ্টভাবে কোডগুলি লিখে রাখেন তবে সেগুলি ট্র্যাক করে রাখুন। এই ক্ষেত্রে:

class Cat:
    census = [] #define census array

    def __init__(self, legs, colour):
        self.colour = colour
        self.legs = legs
        Cat.census.append(self)

এখানে, censusবর্গের একটি শ্রেনী-স্তরের বৈশিষ্ট্য Cat

fluffy = Cat(4, "white")
spark = Cat(4, "fiery")
Cat.census
# ==> [<__main__.Cat instance at 0x108982cb0>, <__main__.Cat instance at 0x108982e18>]
# or something like that

আপনি পাবেন না নোট করুন [fluffy, sparky]। এগুলি কেবল পরিবর্তনশীল নাম। আপনি যদি বিড়ালদের নিজের নাম রাখতে চান তবে আপনাকে নামের জন্য একটি আলাদা বৈশিষ্ট্য তৈরি করতে হবে এবং __str__এই নামটি ফেরত দেওয়ার জন্য পদ্ধতিটি ওভাররাইড করতে হবে । এই পদ্ধতির (অর্থাত্ ক্লাস-বাউন্ড ফাংশন, ঠিক যেমন addবা __init__) উদ্দেশ্যটি হ'ল কীভাবে কোনও স্ট্রিংতে কীভাবে রূপান্তর করা যায়, যেমন আপনি যখন প্রিন্ট করবেন তখন।


7
বাহ, ধন্যবাদ..এটি আসলে আমার কাছে প্রচুর পরিমাণে অনুভূতি তৈরি করেছে যা কিছু যা কিছু তা তৈরি করে, আমাকে আর ডি ফাংশনে প্রাক-ঘোষণা করা দরকার। এই ক্ষেত্রে, কুকুরের পা এবং রঙ রয়েছে। উদাহরণস্বরূপ, আমি যদি এমন একটি ক্লাস তৈরি করি যাতে দুটি সংখ্যা যুক্ত হয়, আমি নিজেই প্রথম নাম্বার এবং সেলফ সেকেন্ডনিম্বার ঘোষণা করব তবে উত্তরটি পাওয়ার জন্য ক্লাসে কেবল প্রথম নম্বরটি + সেকেন্ডনিম্বার করব?
লাস্টসুল

1
ধরনের। আপনি এটা করতে পারে। তবে কেবল জিনিস যুক্ত করার জন্য কোনও শ্রেণি তৈরি করা বোধগম্য নয়। ক্লাসগুলি সাধারণত আচরণগুলির সাথে ডেটা প্রয়োগ করে - খাঁটি আচরণ কেবলমাত্র ফাংশন। আমি প্রাসঙ্গিক কিছু দিয়ে উত্তরটি প্রসারিত করব; একটু অপেক্ষা কর.
আমাদান

3
আশ্চর্যজনক উত্তরের জন্য আপনাকে ধন্যবাদ। আমি এখন ক্লাসের শক্তি দেখতে এবং বুঝতে পারি। দুঃখিত, যদি এটি বোবা লাগছে। আপনি কেবল আমাকে উপলব্ধি করতে পারেন যে আমি ডেটা বাছাই করতে এবং একবারে অনেকগুলি পৃথক জিনিসের স্থিতি বজায় রাখতে পারি (যেখানে আমি কেবল লুপের মাধ্যমে যতগুলি ভেরিয়েবল তৈরি করতে পারি বা আরও অনেক কিছু ট্র্যাক করব)। তাই বলুন, আমার প্রতি কুকুরের গড় পায়ের সংখ্যা বের করা দরকার? ক্লাস দিয়ে আমি যে সমস্ত অবজেক্ট তৈরি করেছি তার একটি তালিকা পুনরুদ্ধার করার কি উপায় আছে যাতে আমি এই জাতীয় একটি Calucation শুরু করতে পারি? বা আমার তৈরি ক্লাসগুলির একটি তালিকাও বজায় রাখা উচিত (যেমন [ফিডো, স্পট])
লাস্টসুল

23

আমদান থেকে সম্পূর্ণ ব্যাখ্যাতে আমার 5 সেন্ট অবদান রাখার জন্য ।

যেখানে ক্লাসগুলি একটি বিমূর্ত পদ্ধতিতে "একটি ধরণের" বর্ণনা রয়েছে। বস্তুগুলি তাদের উপলব্ধি: জীবন্ত শ্বাস প্রশ্বাসের জিনিস। অবজেক্ট-ওরিয়েন্টেড বিশ্বে মূল ধারণাগুলি রয়েছে যা আপনি প্রায় সবকিছুর মূল বলতে পারেন। তারা হ'ল:

  1. এনক্যাপসুলেশন (এটিতে বিস্তারিত বলা হবে না)
  2. উত্তরাধিকার
  3. পলিমরফিজম

বস্তুর একটি বা একাধিক বৈশিষ্ট্য (= বৈশিষ্ট্য) এবং আচরণ (= পদ্ধতি) রয়েছে have আচরণ বেশিরভাগ বৈশিষ্ট্যের উপর নির্ভর করে। শ্রেণিগুলি সাধারণ পদ্ধতিতে আচরণটি কী সম্পাদন করতে হবে তা সংজ্ঞায়িত করে, তবে যতক্ষণ না শ্রেণিটিকে কোনও বস্তু হিসাবে উপলব্ধি করা হয় না (তাত্ক্ষণিক) এটি সম্ভাবনার একটি বিমূর্ত ধারণা হিসাবে থেকে যায়। আমাকে "উত্তরাধিকার" এবং "পলিমারফিজম" এর সাহায্যে চিত্রিত করুন।

    class Human:
        gender
        nationality
        favorite_drink
        core_characteristic
        favorite_beverage
        name
        age

        def love    
        def drink
        def laugh
        def do_your_special_thing                

    class Americans(Humans)
        def drink(beverage):
            if beverage != favorite_drink: print "You call that a drink?"
            else: print "Great!" 

    class French(Humans)
        def drink(beverage, cheese):
            if beverage == favourite_drink and cheese == None: print "No cheese?" 
            elif beverage != favourite_drink and cheese == None: print "Révolution!"

    class Brazilian(Humans)
        def do_your_special_thing
            win_every_football_world_cup()

    class Germans(Humans)
        def drink(beverage):
            if favorite_drink != beverage: print "I need more beer"
            else: print "Lecker!" 

    class HighSchoolStudent(Americans):
        def __init__(self, name, age):
             self.name = name
             self.age = age

jeff = HighSchoolStudent(name, age):
hans = Germans()
ronaldo = Brazilian()
amelie = French()

for friends in [jeff, hans, ronaldo]:
    friends.laugh()
    friends.drink("cola")
    friends.do_your_special_thing()

print amelie.love(jeff)
>>> True
print ronaldo.love(hans)
>>> False

কিছু বৈশিষ্ট্য মানবকে সংজ্ঞায়িত করে। তবে প্রতিটি জাতীয়তা কিছুটা আলাদা হয়। সুতরাং "জাতীয়-প্রকারের" হ'ল ধরণের মানবতা অতিরিক্ত with "আমেরিকানরা" হ'ল এক ধরণের "হিউম্যান" এবং মানব প্রকারের (বেস-ক্লাস) কিছু বিমূর্ত বৈশিষ্ট্য এবং আচরণের উত্তরাধিকারী: এটি উত্তরাধিকার। সুতরাং সমস্ত মানুষ হাসতে পারে এবং পান করতে পারে, তাই সমস্ত শিশু-শ্রেণিও পারে! উত্তরাধিকার (2)

তবে এগুলি সমস্ত একই ধরণের (প্রকার / বেস-শ্রেণি: মানব) আপনি এগুলি মাঝে মাঝে বিনিময় করতে পারেন: শেষে লুপটি দেখুন। তবে তারা একটি স্বতন্ত্র বৈশিষ্ট্য প্রকাশ করবে এবং পলিমারফিজমকে (3) বলে।

সুতরাং প্রতিটি মানুষের একটি প্রিয়_ ড্রিংক রয়েছে তবে প্রতিটি জাতীয়তার বিশেষ প্রবণতা রয়েছে towards যদি আপনি জাতীয়তার জাতীয়তা উপজাত করেন তবে আপনি উত্তরাধিকার সূত্রে প্রাপ্ত আচরণটি ওভাররাইট করতে পারেন যেমন আমি উপরে drink()মেথডটি দিয়ে দেখিয়েছি । তবে এটি এখনও শ্রেণি পর্যায়ে এবং এর কারণে এটি এখনও একটি সাধারণীকরণ।

hans = German(favorite_drink = "Cola")

ক্লাস জার্মান ইনস্ট্যান্ট করে এবং আমি শুরুতে একটি ডিফল্ট বৈশিষ্ট্য "পরিবর্তন" করি। (তবে আপনি যদি hans.drink ('দুধ') কল করেন তবে তিনি এখনও "আমার আরও বিয়ারের দরকার আছে" মুদ্রণ করবেন - এটি একটি স্পষ্ট বাগ ... অথবা সম্ভবত আমি যদি কোনও বড় কোম্পানির কর্মচারী হয়ে থাকি তবে আমি কোনও বৈশিষ্ট্যটি কল করব। ;-)! )

কোনও ধরণের বৈশিষ্ট্য উদাহরণস্বরূপ জার্মান (হ্যান্স) __init__ইনস্ট্যান্টেশনের মুহুর্তে সাধারণত কনস্ট্রাক্টরের মাধ্যমে (পাইথনে :) সংজ্ঞায়িত হয় । এটি এমন একটি বিন্দু যেখানে আপনি কোনও ক্লাসকে অবজেক্টে পরিণত করার সংজ্ঞা দেন। আপনি স্বতন্ত্র বৈশিষ্ট্যগুলি পূরণ করে এবং একটি বস্তুতে পরিণত হয়ে শ্বাসকষ্টকে একটি বিমূর্ত ধারণা (শ্রেণি) হিসাবে বলতে পারেন।

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

প্রতিটি বস্তুর বৈশিষ্ট্যগুলিকে সুরক্ষিত করার জন্য আপনি এগুলি আবদ্ধ করে রাখেন - এর অর্থ আপনি ব্যবহার এবং আচরণের বৈশিষ্ট্যগুলি যুগল করার চেষ্টা করেন এবং অবজেক্টের বাইরের দিক থেকে এটি পরিচালনা করতে কঠোর করে তোলেন। এটি এনক্যাপসুলেশন (1)


5

এটি কেবল উদাহরণের ভেরিয়েবলগুলি সূচনা করার জন্য।

যেমন crawlerএকটি নির্দিষ্ট ডাটাবেসের নাম দিয়ে একটি উদাহরণ তৈরি করুন (উপরে আপনার উদাহরণ থেকে)।


আমি দুঃখিত, আমি সত্যিই বুঝতে পারছি না করছি কি যে ডেভেলপার শুধু তার প্রধান কোড 'বাম = foo বিন্যাস', ইত্যাদি .. মধ্যে যোগ করেছেন above..couldn't উদাহরণ means..in
Lostsoul

আপনি ফাংশনের ডিফল্ট মান বলতে চান? left=Noneবামটি Noneতৈরি করার পরে leftপ্যারামিটারটি নির্দিষ্ট না করা হলে এর সূচনা হবে ।
jldupont

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

1
@ লাস্টসুল: left = fooএকবার কাজ করবে - ক্লাসের পয়েন্টটি হ'ল প্রতিটি আলাদা জন্য বুদ্ধিমান কিছু করা crawler। ক্লাসগুলি ফাংশন নয় বা এমন কিছু যা ফাংশনগুলির সাথে তুলনা করতে পারে (ভাল, যতক্ষণ না আপনি অনেক বেশি উন্নত হন এবং কার্যকরী প্রোগ্রামিংয়ের দিকে না যান, তবে তা আপনাকে এখন বিভ্রান্ত করে দেবে)। ক্লাস আসলে কী তা জন্য আমার উত্তর পড়ুন - আপনি এখনও তা পান না।
আমদানা

4

দেখে মনে হচ্ছে আপনার __init__পাইথনের ব্যবহারের প্রয়োজন যদি আপনি নিজের দৃষ্টান্তগুলির পরিবর্তনীয় বৈশিষ্ট্যগুলি সঠিকভাবে শুরু করতে চান।

নিম্নলিখিত উদাহরণটি দেখুন:

>>> class EvilTest(object):
...     attr = []
... 
>>> evil_test1 = EvilTest()
>>> evil_test2 = EvilTest()
>>> evil_test1.attr.append('strange')
>>> 
>>> print "This is evil:", evil_test1.attr, evil_test2.attr
This is evil: ['strange'] ['strange']
>>> 
>>> 
>>> class GoodTest(object):
...     def __init__(self):
...         self.attr = []
... 
>>> good_test1 = GoodTest()
>>> good_test2 = GoodTest()
>>> good_test1.attr.append('strange')
>>> 
>>> print "This is good:", good_test1.attr, good_test2.attr
This is good: ['strange'] []

এটি জাভাতে একেবারেই আলাদা যেখানে প্রতিটি বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে নতুন মান দিয়ে শুরু হয়:

import java.util.ArrayList;
import java.lang.String;

class SimpleTest
{
    public ArrayList<String> attr = new ArrayList<String>();
}

class Main
{
    public static void main(String [] args)
    {
        SimpleTest t1 = new SimpleTest();
        SimpleTest t2 = new SimpleTest();

        t1.attr.add("strange");

        System.out.println(t1.attr + " " + t2.attr);
    }
}

আমরা স্বজ্ঞাতভাবে আশা করি এমন একটি আউটপুট উত্পাদন করে:

[strange] []

তবে আপনি যদি এটি attrহিসাবে ঘোষণা করেন তবে staticএটি পাইথনের মতো কাজ করবে:

[strange] [strange]

3

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

class Car:
    def __init__(self, color, brand, number_of_seats):
        self.color = color
        self.brand = brand
        self.number_of_seats = number_of_seats
        self.number_of_wheels = 4
        self.registration_number = GenerateRegistrationNumber()

সুতরাং, __init__পদ্ধতিতে আপনি যে উদাহরণটি তৈরি করছেন তার বৈশিষ্ট্যগুলি সংজ্ঞায়িত করছেন। সুতরাং, যদি আমরা 2 জনের জন্য একটি নীল রেনল্ট গাড়ি চাই, আমরা শুরু করি বা পছন্দ করি এর উদাহরণ Car:

my_car = Car('blue', 'Renault', 2)

এইভাবে, আমরা Carক্লাসের একটি উদাহরণ তৈরি করছি । __init__এক যে (যেমন আমাদের নির্দিষ্ট বৈশিষ্ট্য পরিচালনার হয় colorঅথবা brand) এবং তার অন্যান্য বৈশিষ্ট্যাবলী উৎপাদিত মত registration_number


3

ক্লাসগুলি অ্যাট্রিবিউটস (রাষ্ট্র, বৈশিষ্ট্য) এবং পদ্ধতিগুলি (ফাংশন, সক্ষমতা) সহ বস্তু যা সেই বস্তুর জন্য নির্দিষ্ট (যেমন সাদা রঙ এবং উড়ানের শক্তি, যথাক্রমে, হাঁসের জন্য)।

আপনি যখন কোনও শ্রেণীর উদাহরণ তৈরি করেন, আপনি এটিকে কিছু প্রাথমিক ব্যক্তিত্ব (নবজাতকের জন্য নাম এবং তার পোশাকের রঙের মতো অবস্থা বা চরিত্র) দিতে পারেন। আপনি এটি দিয়ে__init__

মূলত __init__আপনি কল করার সময় উদাহরণ বৈশিষ্ট্যগুলি স্বয়ংক্রিয়ভাবে সেট করে instance = MyClass(some_individual_traits)


2

__init__ফাংশন ক্লাসে সমস্ত সদস্য ভেরিয়েবল সেট আপ করা হয়। সুতরাং একবার আপনার দ্বিখণ্ডক তৈরি হয়ে গেলে আপনি সদস্যটিকে অ্যাক্সেস করতে পারেন এবং একটি মান ফিরে পেতে পারেন:

mycluster = bicluster(...actual values go here...)
mycluster.left # returns the value passed in as 'left'

কিছু তথ্যের জন্য পাইথন ডক্স পরীক্ষা করে দেখুন । শেখা চালিয়ে যাওয়ার জন্য আপনি ওও ধারণাগুলির উপর একটি বই তুলতে চাইবেন।


1
class Dog(object):

    # Class Object Attribute
    species = 'mammal'

    def __init__(self,breed,name):
        self.breed = breed
        self.name = name

উপরের উদাহরণে আমরা প্রজাতিগুলিকে বৈশ্বিক হিসাবে ব্যবহার করি কারণ এটি সর্বদা একই থাকবে (ধরণের ধ্রুবক আপনি বলতে পারেন)। আপনি যখন __init__পদ্ধতিটি কল করবেন তখন সমস্ত ভেরিয়েবল __init__শুরু করা হবে (উদা: ব্রিড, নাম)।

class Dog(object):
    a = '12'

    def __init__(self,breed,name,a):
        self.breed = breed
        self.name = name
        self.a= a

আপনি যদি নীচের মত কল করে উপরের উদাহরণটি মুদ্রণ করেন

Dog.a
12

Dog('Lab','Sam','10')
Dog.a
10

এর অর্থ এটি কেবলমাত্র বস্তু তৈরির সময় শুরু করা হবে। সুতরাং আপনি যেটিকে ধ্রুবক হিসাবে ঘোষণা করতে চান তা বৈশ্বিক এবং কিছু পরিবর্তন করে যা ব্যবহার করে make __init__

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