একটি মিশ্রণ কী এবং সেগুলি কেন কার্যকর?


951

" প্রোগ্রামিং পাইথন " -তে, মার্ক লুটজ "মিক্সিনস" উল্লেখ করেছেন। আমি একজন সি / সি ++ / সি # ব্যাকগ্রাউন্ডের এবং আমি এই শব্দটি আগে শুনিনি। মিক্সিন কী?

এই উদাহরণের পংক্তির মধ্যে পড়া (যা আমি এটির সাথে দীর্ঘ সংযুক্ত হয়ে যুক্ত করেছি), আমি অনুমান করছি যে এটি 'যথাযথ' সাবক্লাসিংয়ের বিপরীতে শ্রেণি প্রসারিত করার জন্য একাধিক উত্তরাধিকার ব্যবহারের একটি মামলা। এটা কী ঠিক?

নতুন কার্যকারিতাটি একটি সাবক্লাসে রাখার পরিবর্তে আমি কেন এটি করতে চাই? এই বিষয়টির জন্য, কেন একটি মিশ্রিন / একাধিক উত্তরাধিকারের পদ্ধতিটি রচনা ব্যবহারের চেয়ে ভাল হবে?

মিক্সিনকে একাধিক উত্তরাধিকার থেকে আলাদা করে কী? এটি কি কেবল শব্দার্থবিজ্ঞানের বিষয়?

উত্তর:


706

একটি মিশিন একটি বিশেষ ধরণের একাধিক উত্তরাধিকার। দুটি প্রধান পরিস্থিতি রয়েছে যেখানে মিক্সিনগুলি ব্যবহৃত হয়:

  1. আপনি একটি শ্রেণীর জন্য প্রচুর alচ্ছিক বৈশিষ্ট্য সরবরাহ করতে চান।
  2. আপনি বিভিন্ন শ্রেণিতে প্রচুর একটি নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করতে চান।

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

from werkzeug import BaseRequest

class Request(BaseRequest):
    pass

আমি যদি শিরোনাম সমর্থন গ্রহণ করুন যুক্ত করতে চান, আমি এটি করতে হবে

from werkzeug import BaseRequest, AcceptMixin

class Request(AcceptMixin, BaseRequest):
    pass

যদি আমি এমন একটি অনুরোধের অবজেক্ট তৈরি করতে চাইতাম যা শিরোনাম, এট্যাগ, প্রমাণীকরণ এবং ব্যবহারকারী এজেন্ট সমর্থনকে সমর্থন করে, আমি এটি করতে পারি:

from werkzeug import BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin

class Request(AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthenticationMixin, BaseRequest):
    pass

পার্থক্যটি সূক্ষ্ম, তবে উপরের উদাহরণগুলিতে, মিক্সিন ক্লাসগুলি তাদের নিজের মতো করে দাঁড় করানো হয়নি। আরও প্রচলিত একাধিক উত্তরাধিকারসূত্রে, AuthenticationMixin(উদাহরণস্বরূপ) সম্ভবত আরও কিছু অন্যরকম হবে Authenticator। অর্থাৎ, ক্লাসটি সম্ভবত তার নিজের উপর দাঁড়ানোর জন্য ডিজাইন করা হবে।


123
তৃতীয় পরিস্থিতিটি হ'ল: আপনি কোনও শ্রেণীর জন্য প্রচুর (notচ্ছিক নয়) বৈশিষ্ট্য সরবরাহ করতে চান তবে আপনি পৃথক শ্রেণিতে (এবং পৃথক মডিউলগুলিতে) বৈশিষ্ট্যগুলি চান তাই প্রতিটি মডিউল একটি বৈশিষ্ট্য (আচরণ।) IOW সম্পর্কে, না পুনরায় ব্যবহারের জন্য, কিন্তু বগি জন্য।
বুটচক

60
সম্ভবত এই উদাহরণে কোনও সমস্যা নয়, তবে আপনি উত্তরাধিকার শৃঙ্খলা তৈরির জন্য সাধারণত প্রধান বেস শ্রেণিটিকে প্রথম বন্ধনী হিসাবে শেষ উপাদান হিসাবে রাখতে চান: অনুরোধ ==> মিক্সিন ==> ... ==> বেসরেকুইস্ট। এখানে দেখুন: ianlewis.org/en/mixins-and-python
hillel

10
@ হিলেল ভাল পয়েন্ট, তবে মনে রাখবেন পাইথন বাম থেকে ডানে ডানদিকে সুপারক্লাসের পদ্ধতিগুলি কল করবে (যখন আপনাকে কনস্ট্রাক্টরকে ওভাররাইড করতে হবে, উদাহরণস্বরূপ)।
এলিসিউ মনার ডস সান্টোস

9
এটি শোভাকর ডিজাইন প্যাটার্নের মতো প্রচুর শোনাচ্ছে।
ডি-জোনস

4
একটি 4 র্থ অবস্থা হল: ইতিমধ্যেই একটি বিদ্যমান পরিবার Parentশ্রেণী এবং Child1, Child2, ChildN3 য় পক্ষের গ্রন্থাগার ভিতরে উপশ্রেণী, এবং আপনি সমগ্র পরিবারের জন্য একটি কাস্টমাইজড আচরণ চাই। আদর্শভাবে আপনি এই জাতীয় আচরণের মধ্যে যোগ করতে চান Parentএবং আশা করি যে ২ য় পক্ষের গ্রন্থাগার বিকাশকারী আপনার পুলের অনুরোধ গ্রহণ করবেন। অন্যথায় আপনাকে নিজের প্রয়োগ করতে হবে class NewBehaviorMixin, এবং তারপরে class NewParent(NewBehaviorMixin, Parent): passএবং class NewChildN(NewBehaviorMixin, ChildN): passইত্যাদি ইত্যাদির মতো পুরো মোড়ক ক্লাসের সংজ্ঞা দিতে হবে (পিএস: আপনি কি আরও ভাল উপায় জানেন?)
রায়লুও

240

প্রথমত, আপনার লক্ষ্য রাখতে হবে যে মিশ্রণগুলি কেবল একাধিক-উত্তরাধিকারী ভাষায় রয়েছে। আপনি জাভা বা সি # তে মিক্সিন করতে পারবেন না।

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

মিক্সিনগুলি সাধারণত স্কোপগুলিতে সংকীর্ণ হয় এবং এটি প্রসারিত করার উদ্দেশ্যে নয়।

[সম্পাদনা করুন - কেন:]

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

[2 সম্পাদনা করুন - আপনার অন্যান্য প্রশ্নের উত্তর দিতে]

মিক্সিনকে একাধিক উত্তরাধিকার থেকে আলাদা করে কী? এটি কি কেবল শব্দার্থবিজ্ঞানের বিষয়?

হ্যাঁ. মিক্সিন এবং স্ট্যান্ডার্ড একাধিক উত্তরাধিকারের মধ্যে পার্থক্য কেবল শব্দার্থবিজ্ঞানের বিষয়; একাধিক উত্তরাধিকার আছে এমন একটি শ্রেণি সেই একাধিক উত্তরাধিকার অংশ হিসাবে একটি মিশ্রণটি ব্যবহার করতে পারে।

মিক্সিনের মূলটি হ'ল একটি প্রকার তৈরি করা যা উত্তরাধিকার সূত্রে উত্তরাধিকারের মাধ্যমে অন্য কোনও প্রকারের সাথে "মিশ্রিত" হতে পারে তবে এখনও সেই ধরণের জন্য কিছু উপকারী কার্যকারিতা সরবরাহ করার সময়।

আবার, এমন একটি ইন্টারফেসের কথা ভাবুন যা ইতিমধ্যে প্রয়োগ করা হয়েছে।

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

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

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

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

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

এখন এই পরিস্থিতিটি অন্যান্য জিনিসের জন্য ব্যবহার করার মতো কল্পনা করুন, যেমন একটি মিক্সিন তৈরি করা যা নিশ্চিত করে যে প্রতিটি শ্রেণি যে এটি মিশিয়ে দেয় প্রতিটি পদ্ধতি কল, বা এমন একটি মিক্সিন যা এতে মিশ্রিত হয় সেই ধরণের লেনদেনের সুযোগ দেয় list তালিকাটি চালিয়ে যেতে পারে।

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

আশা রাখি,। :)


25
আরে, আপনি কি "বহুবর্ষীয় অনুরণন" শব্দটি পছন্দ করেন? নিজেই বানিয়েছি। আমি মনে করি. হতে পারে আমি এটি কোথাও পদার্থবিজ্ঞানে শুনেছি ...
র্যান্ডলফো

50
আপনার প্রথম বাক্যে আমি কিছুটা দ্বিমত পোষণ করছি। রুবি হ'ল একক-উত্তরাধিকারের ভাষা এবং মিশ্রিনগুলি অন্য শ্রেণীর বংশোদ্ভূত প্রদত্ত শ্রেণিতে পদ্ধতি যুক্ত করার উপায়।
কেলটিয়া

23
@ কেলটিয়া: আমি মনে করি যে মিক্সিনগুলি হ'ল - সংজ্ঞা অনুসারে - একাধিক-উত্তরাধিকার। রুবির ক্ষেত্রে, তারা একটি বানরপ্যাচ (বা অন্য কিছু) সঠিক মিশ্রণ নয়। রুবি লোকেরা এটিকে মিক্সিন বলতে পারে তবে এটি ভিন্ন ধরণের জিনিস।
এস .লট

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

8
রেকর্ডের জন্য, জাভা এখন ডিফল্ট পদ্ধতির সাথে মিক্সিনগুলি সমর্থন করে।
shmosel

169

এই উত্তরটির উদাহরণগুলির সাথে মিশ্রগুলি ব্যাখ্যা করার লক্ষ্য রয়েছে:

  • স্ব-অন্তর্ভুক্ত : সংক্ষেপে, উদাহরণটি বোঝার জন্য কোনও গ্রন্থাগার জানতে হবে না।

  • পাইথনে , অন্য ভাষায় নয়।

    এটি বোধগম্য যে রুবি অন্যান্য ভাষার উদাহরণ থেকে এই ভাষাগুলিতে এই শব্দটি প্রচলিত রয়েছে তবে এটি পাইথন থ্রেড।

এটি বিতর্কিত প্রশ্নটিও বিবেচনা করবে:

মিক্সিন বৈশিষ্ট্যযুক্ত করার জন্য কি একাধিক উত্তরাধিকার প্রয়োজনীয়?

সংজ্ঞা

পাইথনের একটি মিশ্রণ কী তা স্পষ্ট করে বলেছি "প্রামাণিক" উত্স থেকে উদ্ধৃতি দেখতে পেলাম।

আমি মিক্সিনের 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 সম্ভব: দুটি উত্পন্ন শ্রেণীর একাধিক উত্তরাধিকার


37

আমি এগুলিকে একাধিক উত্তরাধিকার ব্যবহারের শৃঙ্খলাবদ্ধ উপায় হিসাবে ভাবি - কারণ শেষ পর্যন্ত একটি মিক্সিনই অন্য একটি অজগর শ্রেণি যা (সম্ভবত) ক্লাসগুলি সম্পর্কে মিশ্রণগুলি অনুসরণ করে যা মিক্সিন বলে।

কনভেনশনগুলি সম্পর্কে আমার বোঝাপড়া যা আপনি মিক্সিন বলবেন এমন কোনও বিষয় যা মিক্সিন:

  • পদ্ধতি যুক্ত করে তবে ভেরিয়েবলগুলি নয় (ক্লাস ধ্রুবকগুলি ঠিক আছে)
  • object(পাইথনে) কেবলমাত্র উত্তরাধিকার সূত্রে প্রাপ্ত

এইভাবে এটি একাধিক উত্তরাধিকারের সম্ভাব্য জটিলতা সীমাবদ্ধ করে এবং আপনাকে কোথায় দেখতে হবে তা সীমাবদ্ধ রেখে আপনার প্রোগ্রামের প্রবাহকে ট্র্যাক করা যুক্তিসঙ্গতভাবে সহজ করে তোলে (সম্পূর্ণ একাধিক উত্তরাধিকারের তুলনায়)। এগুলি রুবি মডিউলগুলির মতো

যদি আমি উদাহরণের ভেরিয়েবলগুলি যুক্ত করতে চাই (একক উত্তরাধিকার হিসাবে অনুমোদিত চেয়ে আরও নমনীয়তা সহ) তবে আমি রচনাতে যেতে ঝোঁক।

এটি বলার পরে, আমি এক্সওয়াইজেডমিক্সিন নামে ক্লাসগুলি দেখেছি যার উদাহরণ ভেরিয়েবল রয়েছে।


30

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

আমি এই ভিডিওটি http://www.youtube.com/watch?v=v_uKI2NOLEM দেখেছি মিশ্রণের মূল বিষয়গুলি বুঝতে understand মিক্সিনের মূল বিষয়গুলি এবং তারা কীভাবে কাজ করে এবং এগুলি বাস্তবায়নে আপনার যে সমস্যার মুখোমুখি হতে পারে তা বোঝার জন্য প্রাথমিকভাবে এটি দরকারী।

উইকিপিডিয়া এখনও সেরা: http://en.wikedia.org/wiki/ মিক্সিন


29

মিক্সিনকে একাধিক উত্তরাধিকার থেকে আলাদা করে কী? এটি কি কেবল শব্দার্থবিজ্ঞানের বিষয়?

একটি মিশিন একাধিক উত্তরাধিকারের একটি সীমাবদ্ধ ফর্ম। কিছু ভাষায় একটি শ্রেণিতে একটি মিশ্রণ যুক্ত করার প্রক্রিয়া উত্তরাধিকারের চেয়ে সামান্য আলাদা (সিনট্যাক্সের ক্ষেত্রে) is

বিশেষত পাইথনের প্রসঙ্গে, মিক্সিন হ'ল একটি প্যারেন্ট ক্লাস যা সাবক্লাসগুলিতে কার্যকারিতা সরবরাহ করে তবে তা নিজেই ইনস্ট্যান্ট করার উদ্দেশ্যে নয়।

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

একাধিক উত্তরাধিকার উদাহরণ

ডকুমেন্টেশন থেকে এই উদাহরণটি একটি অর্ডারড কাউন্টার:

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first encountered'

     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)

এটি মডিউলটি থেকে Counterএবং উভয়ই সাবক্লাস করে ।OrderedDictcollections

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

কোডটি পুনরায় ব্যবহার করার এটি একটি শক্তিশালী উপায় তবে এটি সমস্যাযুক্তও হতে পারে। যদি এটির দেখা যায় যে কোনও একটিতে একটি বাগ রয়েছে, যত্ন ছাড়াই এটি ঠিক করা উপক্লাসে একটি বাগ তৈরি করতে পারে।

মিক্সিনের উদাহরণ

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

উপরের উদাহরণ থেকে ভিন্ন, একটি মেশিন নিজস্ব ব্যবহার করার উদ্দেশ্যে নয়। এটি নতুন বা ভিন্ন কার্যকারিতা সরবরাহ করে।

উদাহরণস্বরূপ, মান গ্রন্থাগার একটি দম্পতি আছে মধ্যে mixins socketserverগ্রন্থাগার

এই মিক্স-ইন ক্লাসগুলি ব্যবহার করে প্রতিটি ধরণের সার্ভারের সংস্করণ গঠন এবং থ্রেডিং তৈরি করা যেতে পারে। উদাহরণস্বরূপ, থ্রেডিং ইউডিপিএস সার্ভারটি নীচে তৈরি করা হয়েছে:

class ThreadingUDPServer(ThreadingMixIn, UDPServer):
    pass

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

এই ক্ষেত্রে, মিশ্রণ পদ্ধতি UDPServerসম্মতি স্বীকৃতি দেওয়ার জন্য অবজেক্ট সংজ্ঞাতে পদ্ধতিগুলিকে ওভাররাইড করে ।

ওভাররাইড হওয়া পদ্ধতিটি মনে হয় process_requestএবং এটি অন্য একটি পদ্ধতিও সরবরাহ করে process_request_thread,। এটি উত্স কোড থেকে এখানে :

class ThreadingMixIn:
        """Mix-in class to handle each request in a new thread."""

        # Decides how threads will act upon termination of the
        # main process
        daemon_threads = False

        def process_request_thread(self, request, client_address):
            """Same as in BaseServer but as a thread.
            In addition, exception handling is done here.
            """
            try:
                self.finish_request(request, client_address)
            except Exception:
                self.handle_error(request, client_address)
            finally:
                self.shutdown_request(request)

        def process_request(self, request, client_address):
            """Start a new thread to process the request."""
            t = threading.Thread(target = self.process_request_thread,
                                 args = (request, client_address))
            t.daemon = self.daemon_threads
            t.start()

একটি কৃত্রিম উদাহরণ

এটি একটি মিশ্রণ যা বেশিরভাগ প্রদর্শনের উদ্দেশ্যে হয় - বেশিরভাগ বস্তু এই প্রতিবেদনের কার্যকারিতা ছাড়িয়ে বিকশিত হবে:

class SimpleInitReprMixin(object):
    """mixin, don't instantiate - useful for classes instantiable
    by keyword arguments to their __init__ method.
    """
    __slots__ = () # allow subclasses to use __slots__ to prevent __dict__
    def __repr__(self):
        kwarg_strings = []
        d = getattr(self, '__dict__', None)
        if d is not None:
            for k, v in d.items():
                kwarg_strings.append('{k}={v}'.format(k=k, v=repr(v)))
        slots = getattr(self, '__slots__', None)
        if slots is not None:
            for k in slots:
                v = getattr(self, k, None)
                kwarg_strings.append('{k}={v}'.format(k=k, v=repr(v)))
        return '{name}({kwargs})'.format(
          name=type(self).__name__,
          kwargs=', '.join(kwarg_strings)
          )

এবং ব্যবহার হবে:

class Foo(SimpleInitReprMixin): # add other mixins and/or extend another class here
    __slots__ = 'foo',
    def __init__(self, foo=None):
        self.foo = foo
        super(Foo, self).__init__()

এবং ব্যবহার:

>>> f1 = Foo('bar')
>>> f2 = Foo()
>>> f1
Foo(foo='bar')
>>> f2
Foo(foo=None)

11

আমি মনে করি এখানে কিছু ভাল ব্যাখ্যা হয়েছে তবে আমি অন্য দৃষ্টিকোণটি সরবরাহ করতে চেয়েছিলাম।

স্ক্যালায়, আপনি এখানে বর্ণিত হিসাবে মিক্সিনগুলি করতে পারেন তবে খুব আকর্ষণীয় বিষয়টি হ'ল মিক্সিনগুলি আসলে একসাথে 'মিশ্রিত' হয় যাতে উত্তরাধিকার সূত্রে একটি নতুন ধরণের শ্রেণি তৈরি হয়। সংক্ষেপে, আপনি একাধিক ক্লাস / মিক্সিন থেকে উত্তরাধিকারী হন না, বরং উত্তরাধিকার সূত্রে মিক্সিনের সমস্ত বৈশিষ্ট্য সহ একটি নতুন ধরণের শ্রেণি তৈরি করেন। এটি স্কেলটি JVM এর উপর ভিত্তি করে যেখানে একাধিক-উত্তরাধিকার বর্তমানে সমর্থিত নয় (জাভা 8 হিসাবে) এটি বোধগম্য হয়। এই মিশ্রণ শ্রেণির ধরণ, যাইহোক, স্কালায় একটি বৈশিষ্ট্যযুক্ত একটি বিশেষ প্রকার।

এটি ক্লাসের সংজ্ঞায়িত করার পদ্ধতিতে ইঙ্গিতযুক্ত: ক্লাস নিউক্লাস থার্ডমিক্সিনের সাথে দ্বিতীয় মিক্সিনের সাথে ফার্স্টমিক্সিন প্রসারিত করে ...

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


9

আমি নতুন পাইথন কোডে মিক্স-ইনগুলির বিরুদ্ধে পরামর্শ দেব, যদি আপনি এর আশেপাশে অন্য কোনও উপায় (যেমন রচনা-পরিবর্তে-উত্তরাধিকার হিসাবে, বা কেবল নিজের শ্রেণীর মধ্যে বানর-প্যাচিংয়ের পদ্ধতি) খুঁজে পান তবে এটি আরও বেশি কিছু নয় isn't প্রচেষ্টা.

পুরানো স্টাইলের ক্লাসে আপনি অন্য শ্রেণীর কাছ থেকে কয়েকটি পদ্ধতি গ্রহণের উপায় হিসাবে মিক্স-ইনগুলি ব্যবহার করতে পারেন। তবে নতুন স্টাইলের বিশ্বে সমস্ত কিছু এমনকি মিক্স-ইনও উত্তরাধিকার সূত্রে প্রাপ্ত object। এর অর্থ হ'ল একাধিক উত্তরাধিকারের কোনও ব্যবহার স্বাভাবিকভাবেই এমআরও সমস্যাগুলি প্রবর্তন করে ।

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


3
যেহেতু সংস্করণ ২.৩ পাইথন পাইথন ২.৩ পদ্ধতি রেজোলিউশন অর্ডার বা পদ্ধতি রেজোলিউশন অর্ডারে বর্ণিত "সি 3 পদ্ধতি রেজোলিউশন" ব্যবহার করে ।
ওয়েবওয়ার্স

11
ব্যক্তিগতভাবে, আমি বেশিরভাগ ক্ষেত্রে বানর-প্যাচিংয়ের উপরে মিশ্রণগুলি গ্রহণ করতাম; কোডটির মাধ্যমে যুক্তি এবং অনুসরণ করা সহজ easier
টিডামার্স

5
Downvoted। আপনার উত্তরটি বিকাশের শৈলীর একটি বৈধ মতামত প্রকাশ করার সময়, আপনি প্রকৃত প্রশ্নটিকে সত্যই সম্বোধন করেন না।
রায়ান বি লিঞ্চ

8

সম্ভবত কয়েকটি উদাহরণ সাহায্য করবে।

যদি আপনি একটি শ্রেণি তৈরি করে থাকেন এবং আপনি এটি অভিধানের মতো কাজ করতে চান তবে আপনি __ __প্রয়োজনীয় বিভিন্ন পদ্ধতি নির্ধারণ করতে পারেন । তবে তা কিছুটা ব্যথা। বিকল্প হিসাবে, আপনি কেবল কয়েকটি সংজ্ঞায়িত করতে পারেন এবং উত্তরাধিকারী (অন্য কোনও উত্তরাধিকারের সাথে) থেকে UserDict.DictMixin( collections.DictMixinপাইওয়াইকে স্থানান্তরিত ) করতে পারেন। এটি বাকী সমস্ত এপিআই স্বয়ংক্রিয়ভাবে সংজ্ঞায়নের প্রভাব ফেলবে have

দ্বিতীয় উদাহরণ: জিইউআই টুলকিট ডাব্লুএক্সপিথন আপনাকে একাধিক কলাম (যেমন ধরুন, উইন্ডোজ এক্সপ্লোরারটিতে ফাইল প্রদর্শন) দিয়ে কন্ট্রোল তালিকা তৈরি করতে দেয় list ডিফল্টরূপে, এই তালিকাগুলি মোটামুটি বেসিক are আপনি অতিরিক্ত কার্যকারিতা যুক্ত করতে পারেন, যেমন কলাম শিরোনামের উপর ক্লিক করে, তালিকাCtrl থেকে উত্তরাধিকার সূত্রে এবং উপযুক্ত মিশ্রণগুলি যুক্ত করে একটি নির্দিষ্ট কলাম দ্বারা তালিকাটিকে সাজানোর ক্ষমতা।


8

এটি পাইথনের উদাহরণ নয় তবে ডি প্রোগ্রামিং ভাষায় এই শব্দটি mixinকোনও একইভাবে ব্যবহৃত একটি নির্মাণকে বোঝাতে ব্যবহৃত হয়; একটি ক্লাসে স্টাইলের গাদা যুক্ত করা।

ডি-তে (যা এমআই করেন না) এটি একটি টেম্পলেট (সিনট্যাকটিকালি সচেতন এবং নিরাপদ ম্যাক্রোগুলি ভাবেন এবং আপনি নিকটে থাকবেন) একটি সুযোগে সন্নিবেশ করিয়ে এটি করা হয়। এটি ক্লাস, স্ট্রাক্ট, ফাংশন, মডিউল বা যে কোনও সংখ্যক ঘোষণার প্রসারিত করতে কোডের একক লাইন কোডের অনুমতি দেয়।


2
মিক্সিন একটি সাধারণ শব্দ, যা ডি, রুবি ইত্যাদিতে ব্যবহৃত হয়, উইকিপিডিয়া অনুসারে, এটি পুরাতন স্কুল লিস্প সিস্টেমে উদ্ভূত হয়েছিল এবং 1983 সালে প্রথম নথিভুক্ত হয়েছিল: en.wikedia.org/wiki/…
লি বি

7

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

সিআরটিপি প্যাটার্নটি এখানে বিশদে বর্ণনা করা হয়েছে

আমি নীচে টেমপ্লেট শ্রেণি ব্যবহার করে @ সিরো সান্তিলির উত্তরটিকে সি ++ তে রূপান্তরিত করেছি:

    #include <iostream>
    #include <assert.h>

    template <class T>
    class ComparableMixin {
    public:
        bool operator !=(ComparableMixin &other) {
            return ~(*static_cast<T*>(this) == static_cast<T&>(other));
        }
        bool operator <(ComparableMixin &other) {
            return ((*(this) != other) && (*static_cast<T*>(this) <= static_cast<T&>(other)));
        }
        bool operator >(ComparableMixin &other) {
            return ~(*static_cast<T*>(this) <= static_cast<T&>(other));
        }
        bool operator >=(ComparableMixin &other) {
            return ((*static_cast<T*>(this) == static_cast<T&>(other)) || (*(this) > other));
        }
        protected:
            ComparableMixin() {}
    };

    class Integer: public ComparableMixin<Integer> {
    public:
     Integer(int i) {
         this->i = i;
     }
     int i;
     bool operator <=(Integer &other) {
         return (this->i <= other.i);
     }
     bool operator ==(Integer &other) {
         return (this->i == other.i);
     }
    };

int main() {

    Integer i(0) ;
    Integer j(1) ;
    //ComparableMixin<Integer> c; // this will cause compilation error because constructor is protected.
    assert (i < j );
    assert (i != j);
    assert (j >  i);
    assert (j >= i);

    return 0;
}

সম্পাদনা: তুলনামূলক মিক্সিনে সুরক্ষিত কনস্ট্রাক্টর যুক্ত করা হয়েছে যাতে এটি কেবল উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে এবং তাত্ক্ষণিকভাবে নয়। তুলনামূলক মিক্সিনের একটি অবজেক্ট তৈরি করা হলে সুরক্ষিত কনস্ট্রাক্টর কীভাবে সংকলন ত্রুটি সৃষ্টি করবে তা দেখানোর জন্য উদাহরণ আপডেট করে।


মিক্সিনস এবং সিআরটিপি সি ++ তে খুব বেশি একই জিনিস নয়।
আশ্রসমুন

6

রুবির কোনও উদাহরণ সাহায্য করতে পারে:

আপনি মিক্সিন অন্তর্ভুক্ত করতে পারেন Comparableএবং একটি ফাংশন সংজ্ঞায়িত করতে পারেন "<=>(other)", মিক্সিন এই সমস্ত ফাংশন সরবরাহ করে:

<(other)
>(other)
==(other)
<=(other)
>=(other)
between?(other)

এটি চাওয়া <=>(other)এবং সঠিক ফলাফল ফিরিয়ে দিয়ে এটি করে ।

"instance <=> other"উভয় বস্তু সমান হলে 0, instanceবৃহত্তর থেকে 0 এর চেয়ে কম otherএবং otherবড় হলে 0 এর চেয়ে বেশি প্রদান করে ।


পাইথনের অনুরূপ মিক্সিন সরবরাহকারী একটি পোস্ট এখানে । যদিও প্রস্তাবটি __lt__পরিবর্তে বেস হিসাবে সংজ্ঞায়িত করা হচ্ছে __cmp__তবে এর পরবর্তীটি প্রকৃতপক্ষে অবচয় এবং ব্যবহার করতে নিরুত্সাহিত। আমার কাছে এটা বেশ জটিল পরিবর্তে যে mixin ব্যবহার করতে সহজ বলে মনে হয় টেকনিক (অংশ functools ) - যদিও এই এক আরো পরিবর্তনশীল প্রতিক্রিয়া উপর সক্ষম হতে পারে যা তুলনা প্রদান করা হয় ...
Tobias Kienzler

6

মিশিন একটি ক্লাসে কার্যকারিতা যুক্ত করার একটি উপায় দেয়, আপনি পছন্দসই শ্রেণীর অভ্যন্তরে মডিউলটি অন্তর্ভুক্ত করে মডিউলটিতে সংজ্ঞায়িত পদ্ধতির সাথে ইন্টারেক্ট করতে পারেন can যদিও রুবি একাধিক উত্তরাধিকার সমর্থন করে না তবে এটি অর্জনের বিকল্প হিসাবে মিক্সিন সরবরাহ করে।

এখানে মেসিন ব্যবহার করে কীভাবে একাধিক উত্তরাধিকার অর্জিত হয় তা ব্যাখ্যা করে।

module A    # you create a module
    def a1  # lets have a method 'a1' in it
    end
    def a2  # Another method 'a2'
    end
end

module B    # let's say we have another module
    def b1  # A method 'b1'
    end
    def b2  #another method b2
    end
end

class Sample    # we create a class 'Sample'
    include A   # including module 'A' in the class 'Sample' (mixin)
    include B   # including module B as well

    def S1      #class 'Sample' contains a method 's1'
    end
end

samp = Sample.new    # creating an instance object 'samp'

# we can access methods from module A and B in our class(power of mixin)

samp.a1     # accessing method 'a1' from module A
samp.a2     # accessing method 'a2' from module A
samp.b1     # accessing method 'b1' from module B
samp.b2     # accessing method 'a2' from module B
samp.s1     # accessing method 's1' inside the class Sample

4
সাধারণভাবে এই এবং একাধিক উত্তরাধিকারের মধ্যে পার্থক্য কী?
সিরো সান্তিলি 冠状 病毒 审查 六四 事件 法轮功

পার্থক্যটি হ'ল আপনি মডিউলগুলি থেকে দৃষ্টান্ত তৈরি করতে সক্ষম নন, তবে সাধারণ শ্রেণি এবং মডিউলগুলির মধ্যে কোনও পার্থক্য না থাকলে মিশিনগুলি সুস্পষ্ট জিনিস নয় এবং এটি একটি সাধারণ শ্রেণি কোথায় এবং কোথায় মিশ্রণ রয়েছে তা বোঝা শক্ত হয়ে যায়
ka8725

সুতরাং রুবি মিশ্রিনগুলিতে কেবল এমন ক্লাস রয়েছে যা ইনস্ট্যান্ট করা যায় না তবে একাধিক উত্তরাধিকারের জন্য অবশ্যই ব্যবহার করা উচিত?
ট্রিলারিয়ন

6

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

সুতরাং, আপনি spfmilter এর মতো একটি অপরিশোধিত মিল্টার অ্যাপ্লিকেশন গ্রহণ করেন এবং টেস্টবেসকে এইভাবে মিশ্রণ করুন:

class TestMilter(TestBase,spfmilter.spfMilter):
  def __init__(self):
    TestBase.__init__(self)
    spfmilter.config = spfmilter.Config()
    spfmilter.config.access_file = 'test/access.db'
    spfmilter.spfMilter.__init__(self)

তারপরে, মিল্টার আবেদনের জন্য পরীক্ষার ক্ষেত্রে টেস্টমিল্টার ব্যবহার করুন:

def testPass(self):
  milter = TestMilter()
  rc = milter.connect('mail.example.com',ip='192.0.2.1')
  self.assertEqual(rc,Milter.CONTINUE)
  rc = milter.feedMsg('test1',sender='good@example.com')
  self.assertEqual(rc,Milter.CONTINUE)
  milter.close()

http://pymilter.cvs.sourceforge.net/viewvc/pymilter/pymilter/Milter/test.py?revision=1.6&view=markup


4

আমি মনে করি পূর্ববর্তী প্রতিক্রিয়াগুলি মিক্স ইনসটি কী তা খুব ভালভাবে সংজ্ঞায়িত করে । তবে এগুলি আরও ভালভাবে বুঝতে, কোড / প্রয়োগের দৃষ্টিভঙ্গি থেকে মিক্স ইনসটি অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের সাথে তুলনা করা কার্যকর হতে পারে :

1. বিমূর্ত শ্রেণি

  • এক বা একাধিক বিমূর্ত পদ্ধতি থাকা ক্লাসে

  • সারাংশ ক্লাস করতে রাষ্ট্র (উদাহরণস্বরূপ ভেরিয়েবল) এবং অ বিমূর্ত পদ্ধতি ধারণ

2. ইন্টারফেস

  • ইন্টারফেসে কেবল বিমূর্ত পদ্ধতি রয়েছে (কোনও অ-বিমূর্ত পদ্ধতি এবং কোনও অভ্যন্তরীণ অবস্থা নেই)

3. মিক্স ইনস

  • মিক্স ইনস (ইন্টারফেসের মতো) অভ্যন্তরীণ অবস্থা (উদাহরণ ভেরিয়েবল) ধারণ করে না
  • MixIns এক বা একাধিক অ বিমূর্ত পদ্ধতি (সেগুলির মধ্যে উপস্থিত করতে পারেন ইন্টারফেসগুলি অসদৃশ অ বিমূর্ত পদ্ধতি ধারণ)

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


3

আমি পড়েছি যে আপনার কাছে # টি ব্যাকগ্রাউন্ড রয়েছে। সুতরাং একটি ভাল সূচনা পয়েন্ট .NET এর জন্য একটি মিশ্রণ বাস্তবায়ন হতে পারে।

আপনি কোডেপ্লেক্স প্রকল্পটি http://remix.codeplex.com/ এ দেখতে পারেন

একটি সংক্ষিপ্ত বিবরণ পেতে lang.net সিম্পোজিয়াম লিঙ্কটি দেখুন। কোডেপ্লেক্স পৃষ্ঠায় ডকুমেন্টেশনে আসতে আরও এখনও রয়েছে।

শুভেচ্ছা স্টেফান

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