আপনি যা লিখেছেন তা দ্বারা, আপনি একটি সমালোচনার টুকরো অনুপস্থিত: একটি শ্রেণি এবং একটি সামগ্রীর মধ্যে পার্থক্য। __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__) উদ্দেশ্যটি হ'ল কীভাবে কোনও স্ট্রিংতে কীভাবে রূপান্তর করা যায়, যেমন আপনি যখন প্রিন্ট করবেন তখন।