এই উত্তরটির উদাহরণগুলির সাথে মিশ্রগুলি ব্যাখ্যা করার লক্ষ্য রয়েছে:
স্ব-অন্তর্ভুক্ত : সংক্ষেপে, উদাহরণটি বোঝার জন্য কোনও গ্রন্থাগার জানতে হবে না।
পাইথনে , অন্য ভাষায় নয়।
এটি বোধগম্য যে রুবি অন্যান্য ভাষার উদাহরণ থেকে এই ভাষাগুলিতে এই শব্দটি প্রচলিত রয়েছে তবে এটি পাইথন থ্রেড।
এটি বিতর্কিত প্রশ্নটিও বিবেচনা করবে:
মিক্সিন বৈশিষ্ট্যযুক্ত করার জন্য কি একাধিক উত্তরাধিকার প্রয়োজনীয়?
সংজ্ঞা
পাইথনের একটি মিশ্রণ কী তা স্পষ্ট করে বলেছি "প্রামাণিক" উত্স থেকে উদ্ধৃতি দেখতে পেলাম।
আমি মিক্সিনের 2 সম্ভাব্য সংজ্ঞা দেখেছি (যদি এগুলি অ্যাবস্ট্রাক বেস শ্রেণীর মতো অন্যান্য অনুরূপ ধারণার চেয়ে পৃথক হিসাবে বিবেচনা করা হয়), এবং কোনটি সঠিক তা নিয়ে লোকেরা সম্পূর্ণরূপে একমত হয় না।
Languagesকমত্য বিভিন্ন ভাষার মধ্যে পৃথক হতে পারে।
সংজ্ঞা 1: একাধিক উত্তরাধিকার নেই
একটি মিশিন একটি শ্রেণি যেমন শ্রেণীর কিছু পদ্ধতি এমন একটি পদ্ধতি ব্যবহার করে যা শ্রেণিতে সংজ্ঞায়িত হয় না।
সুতরাং ক্লাসটি তাত্ক্ষণিকভাবে বোঝানো নয়, বরং একটি বেস ক্লাস হিসাবে পরিবেশন করা। অন্যথায় উদাহরণটিতে এমন পদ্ধতি রয়েছে যা ব্যতিক্রম না বাড়ানো ছাড়া কল করা যায় না।
কিছু সংস্থান যা কিছু উত্স যুক্ত করে তা হ'ল ক্লাসে ডেটা, কেবল পদ্ধতি না থাকতে পারে তবে কেন এটি প্রয়োজনীয় তা আমি দেখতে পাচ্ছি না। তবে বাস্তবে, অনেক দরকারী মিক্সিনের কোনও ডেটা থাকে না এবং ডেটা ছাড়াই বেস ক্লাসগুলি ব্যবহার করা সহজ are
একটি ক্লাসিক উদাহরণ কেবল <=
এবং এর থেকে সমস্ত তুলনামূলক অপারেটরগুলির বাস্তবায়ন ==
:
class ComparableMixin(object):
"""This class has methods which use `<=` and `==`,
but this class does NOT implement those methods."""
def __ne__(self, other):
return not (self == other)
def __lt__(self, other):
return self <= other and (self != other)
def __gt__(self, other):
return not self <= other
def __ge__(self, other):
return self == other or self > other
class Integer(ComparableMixin):
def __init__(self, i):
self.i = i
def __le__(self, other):
return self.i <= other.i
def __eq__(self, other):
return self.i == other.i
assert Integer(0) < Integer(1)
assert Integer(0) != Integer(1)
assert Integer(1) > Integer(0)
assert Integer(1) >= Integer(1)
# It is possible to instantiate a mixin:
o = ComparableMixin()
# but one of its methods raise an exception:
#o != o
এই বিশেষ উদাহরণটি functools.total_ordering()
সজ্জাকারের মাধ্যমে অর্জন করা যেতে পারে তবে এখানে গেমটি হুইলটি পুনর্নবীকরণ করা ছিল:
import functools
@functools.total_ordering
class Integer(object):
def __init__(self, i):
self.i = i
def __le__(self, other):
return self.i <= other.i
def __eq__(self, other):
return self.i == other.i
assert Integer(0) < Integer(1)
assert Integer(0) != Integer(1)
assert Integer(1) > Integer(0)
assert Integer(1) >= Integer(1)
সংজ্ঞা 2: একাধিক উত্তরাধিকার
মিক্সিন হ'ল একটি নকশার প্যাটার্ন যেখানে বেস ক্লাসের কিছু পদ্ধতি এমন কোনও পদ্ধতি ব্যবহার করে যা এটি সংজ্ঞায়িত করে না এবং সেই পদ্ধতিটি বোঝানো হয় সংজ্ঞা 1-এর মতো প্রাপ্ত নয়, অন্য বেস শ্রেণীর দ্বারা প্রয়োগ করা ।
মেয়াদ mixin বর্গ যা নকশা প্যাটার্ন ব্যবহার করা উদ্দেশ্য বেস ক্লাস বোঝায় (ঐ যে পদ্ধতি ব্যবহার করুন, অথবা ঐ যে তা বাস্তবায়ন করণীয়?)
কোনও প্রদত্ত শ্রেণীর মিশ্রণ রয়েছে কিনা তা নির্ধারণ করা সহজ নয়: পদ্ধতিটি কেবলমাত্র উদ্ভূত শ্রেণীর উপর প্রয়োগ করা যেতে পারে, সেই ক্ষেত্রে আমরা সংজ্ঞাতে ফিরে এসেছি You আপনাকে লেখকের উদ্দেশ্যগুলি বিবেচনা করতে হবে।
এই নিদর্শনটি আকর্ষণীয় কারণ বেস বেস শ্রেণীর বিভিন্ন পছন্দ সহ কার্যকারিতা পুনরায় সংযুক্ত করা সম্ভব:
class HasMethod1(object):
def method(self):
return 1
class HasMethod2(object):
def method(self):
return 2
class UsesMethod10(object):
def usesMethod(self):
return self.method() + 10
class UsesMethod20(object):
def usesMethod(self):
return self.method() + 20
class C1_10(HasMethod1, UsesMethod10): pass
class C1_20(HasMethod1, UsesMethod20): pass
class C2_10(HasMethod2, UsesMethod10): pass
class C2_20(HasMethod2, UsesMethod20): pass
assert C1_10().usesMethod() == 11
assert C1_20().usesMethod() == 21
assert C2_10().usesMethod() == 12
assert C2_20().usesMethod() == 22
# Nothing prevents implementing the method
# on the base class like in Definition 1:
class C3_10(UsesMethod10):
def method(self):
return 3
assert C3_10().usesMethod() == 13
অথরটিভ পাইথনের ঘটনা
এ collections.abc জন্য অফিসিয়াল documentatiton ডকুমেন্টেশন স্পষ্টভাবে শব্দটি ব্যবহার Mixin পদ্ধতি ।
এটিতে বলা হয়েছে যে একটি শ্রেণি যদি:
- সরঁজাম
__next__
- একক শ্রেণী থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
Iterator
তারপরে ক্লাসটি বিনামূল্যে একটি __iter__
মিশ্রণ পদ্ধতি পায় ।
অন্তত ডকুমেন্টেশনের এই পয়েন্টে, মিশিনকে একাধিক উত্তরাধিকারের প্রয়োজন হয় না এবং সংজ্ঞা 1 এর সাথে সুসংগত হয়।
ডকুমেন্টেশন অবশ্যই বিভিন্ন পয়েন্টে পরস্পরবিরোধী হতে পারে এবং অন্যান্য গুরুত্বপূর্ণ পাইথন গ্রন্থাগারগুলি তাদের ডকুমেন্টেশনে অন্যান্য সংজ্ঞাটি ব্যবহার করতে পারে।
এই পৃষ্ঠাটি শব্দটিও ব্যবহার করে Set mixin
, যা পরিষ্কারভাবে প্রস্তাব দেয় যে ক্লাসগুলি পছন্দ করে Set
এবং Iterator
তাকে মিক্সিন ক্লাস বলা যেতে পারে।
অন্যান্য ভাষায়
রুবি: স্পষ্টভাবে মেশিনের জন্য একাধিক উত্তরাধিকারের প্রয়োজন নেই, যেমন প্রোগ্রামিং রুবি এবং দ্য রুবি প্রোগ্রামিং ল্যাঙ্গুয়েজের মতো প্রধান রেফারেন্স বইগুলিতে উল্লিখিত
সি ++: একটি পদ্ধতি যা প্রয়োগ করা হয় না তা খাঁটি ভার্চুয়াল পদ্ধতি।
সংজ্ঞা 1 বিমূর্ত শ্রেণির সংজ্ঞা (খাঁটি ভার্চুয়াল পদ্ধতি রয়েছে এমন একটি শ্রেণীর) সাথে মিলিত হয়। সেই শ্রেণি তাত্ক্ষণিকভাবে চালু করা যায় না।
ভার্চুয়াল উত্তরাধিকারের মাধ্যমে সংজ্ঞা 2 সম্ভব: দুটি উত্পন্ন শ্রেণীর একাধিক উত্তরাধিকার