මික්සින් යනු කුමක්ද, ඒවා ප්‍රයෝජනවත් වන්නේ ඇයි?


980

" ක්‍රමලේඛන පයිතන් " හි මාර්ක් ලුට්ස් "මික්සින්" ගැන සඳහන් කරයි. මම සී / සී ++ / සී # පසුබිමකින් පැමිණි අයෙක් වන අතර මම මීට පෙර එම පදය අසා නැත. මික්සින් යනු කුමක්ද?

මෙම උදාහරණයේ රේඛා අතර කියවීම (මා එය සම්බන්ධ කර ඇත්තේ තරමක් දිගු නිසා), මම සිතන්නේ එය 'නිසි' උප කාණ්ඩයට වඩා වෙනස්ව පන්තියක් දීර් extend කිරීම සඳහා බහු උරුමයක් භාවිතා කිරීමේ අවස්ථාවකි. මේක හරිද?

නව ක්‍රියාකාරිත්වය උප පංතියකට ඇතුළත් කරනවාට වඩා මට එය කිරීමට අවශ්‍ය ඇයි? එම කාරණය සඳහා, සංයුතිය භාවිතා කිරීමට වඩා මික්සින් / බහු උරුම ප්‍රවේශයක් වඩා හොඳ වන්නේ ඇයි?

බහුවිධ උරුමයෙන් මික්සින් වෙන් කරන්නේ කුමක් ද? එය අර්ථ නිරූපණය පිළිබඳ ප්‍රශ්නයක්ද?

Answers:


729

මික්සින් යනු විශේෂ බහු බහුවිධ උරුමයකි. මික්සින් භාවිතා කරන ප්‍රධාන අවස්ථා දෙකක් තිබේ:

  1. පංතියක් සඳහා විකල්ප අංග රාශියක් සැපයීමට ඔබට අවශ්‍යය.
  2. විවිධ පංති රාශියක එක් විශේෂිත අංගයක් භාවිතා කිරීමට ඔබට අවශ්‍යය.

අංක එකේ උදාහරණයක් සඳහා, වර්ක්සෙග්ගේ ඉල්ලීම සහ ප්‍රතිචාර පද්ධතිය සලකා බලන්න . මට මෙසේ කියමින් සරල පැරණි ඉල්ලීම් වස්තුවක් කළ හැකිය:

from werkzeug import BaseRequest

class Request(BaseRequest):
    pass

පිළිගැනීමේ ශීර්ෂක සහාය එක් කිරීමට මට අවශ්‍ය නම්, මම එය සාදමි

from werkzeug import BaseRequest, AcceptMixin

class Request(AcceptMixin, BaseRequest):
    pass

පිළිගැනීමේ ශීර්ෂයන්, etags, සත්‍යාපනය සහ පරිශීලක නියෝජිත සහාය සඳහා ඉල්ලීම් වස්තුවක් කිරීමට මට අවශ්‍ය නම්, මට මෙය කළ හැකිය:

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

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

වෙනස සියුම් ය, නමුත් ඉහත උදාහරණ වලදී, මික්සින් පංති තනිවම නැගී සිටීමට නොහැකි විය. වඩාත් සාම්ප්‍රදායික බහුවිධ උරුමයන් තුළ, AuthenticationMixin(උදාහරණයක් ලෙස) බොහෝ විට ඊට සමාන දෙයක් වනු ඇත Authenticator. එනම්, පන්තිය තනිවම නැගී සිටීමට සැලසුම් කර ඇත.


128
තුන්වන අවස්ථාව නම්: ඔබට පංතියක් සඳහා (විකල්ප නොවන) විශේෂාංග රාශියක් සැපයීමට අවශ්‍යය, නමුත් ඔබට අවශ්‍ය වන්නේ වෙනම පන්තිවල (සහ වෙනම මොඩියුලවල) විශේෂාංගය, එබැවින් සෑම මොඩියුලයක්ම එක් අංගයක් (හැසිරීම.) IOW, නොවේ නැවත භාවිතා කිරීම සඳහා, නමුත් කොටස් කිරීම සඳහා.
bootchk

62
බොහෝ විට මෙම උදාහරණයේ ගැටලුවක් නොවිය හැක, නමුත් ඔබට සාමාන්‍යයෙන් අවශ්‍ය වන්නේ උරුම දාමය නිර්මාණය කිරීම සඳහා වරහන් තුළ ඇති අවසාන මූලද්‍රව්‍යය ලෙස ප්‍රධාන පාදක පන්තිය තැබීමට ය: ඉල්ලීම ==> මික්සින් ==> ... ==> BaseRequest. මෙහි බලන්න: ianlewis.org/en/mixins-and-python
hillel

10
ill හිල්ල් හොඳ කරුණක්, නමුත් පයිතන් සුපිරි පන්තියේ ක්‍රම වමේ සිට දකුණට කැඳවන බව මතක තබා ගන්න (ඔබට ඉදිකිරීම්කරු අභිබවා යාමට අවශ්‍ය වූ විට, උදාහරණයක් ලෙස).
එලිසු මොනාර් ඩොස් සැන්ටොස්

10
මෙය සැරසිලි සැලසුම් රටාව මෙන් වෙනස් වේ.
ඩී-ජෝන්ස්

4
ඒ 4 වන තත්වය: ක දැනට පවතින පවුලේ දැනටමත් තිබේ Parentපන්තිය හා Child1, Child2, ChildNඑය 3 වන පාර්ශ්ව පුස්තකාලය තුල උප වර්ගිකරණයන්, ඔබ මුළු පවුල සඳහා අවශ්ය පරිදි වෙනස් හැසිරීම අවශ්යයි. ඉතා මැනවින් ඔබ එවැනි හැසිරීම් වලට එකතු කිරීමට කැමති Parentඅතර තෙවන පාර්ශවීය පුස්තකාල සංවර්ධකයා ඔබේ අදින්න ඉල්ලීම ලබා ගනී යැයි බලාපොරොත්තු වෙමු. එසේ නොමැතිනම් ඔබට ඔබේම දෑ ක්‍රියාත්මක කිරීමට සිදුවනු ඇත class NewBehaviorMixin, ඉන්පසු class NewParent(NewBehaviorMixin, Parent): passසහ class NewChildN(NewBehaviorMixin, ChildN): passවැනි යනාදී පන්ති මාලාවක් නිර්වචනය කරන්න . (PS: ඔබ වඩා හොඳ ක්‍රමයක් දන්නවාද?)
RayLuo

244

පළමුවෙන්ම, මික්සින් පවතින්නේ බහු උරුම භාෂාවලින් පමණක් බව ඔබ සටහන් කළ යුතුය. ඔබට ජාවා හෝ සී # හි මික්සින් එකක් කළ නොහැක.

මූලික වශයෙන්, මික්සින් යනු ළමා පන්තියක් සඳහා සීමිත ක්‍රියාකාරීත්වයක් සහ බහුමාමක අනුනාදයක් සපයන තනිවම පදනම් වූ වර්ගයකි. ඔබ C # හි සිතන්නේ නම්, එය දැනටමත් ක්‍රියාත්මක කර ඇති නිසා ඔබට සැබවින්ම ක්‍රියාත්මක කිරීමට අවශ්‍ය නොවන අතුරු මුහුණතක් ගැන සිතන්න; ඔබ එයින් උරුම වී එහි ක්‍රියාකාරීත්වයෙන් ප්‍රයෝජන ගන්න.

මික්සින් සාමාන්‍යයෙන් විෂය පථයෙන් පටු වන අතර එය දිගු කිරීමට අදහස් නොකෙරේ.

[සංස්කරණය කරන්න - ඇයිද යන්න:]

ඔබ ඇසූ දා සිට මම එයට ආමන්ත්‍රණය කළ යුතු යැයි සිතමි. විශාල වාසිය නම් ඔබ එය නැවත නැවතත් කළ යුතු නැති වීමයි. C # හි, මික්සින්ට ප්‍රතිලාභ ලැබිය හැකි විශාලතම ස්ථානය බැහැර කිරීමේ රටාවෙන් විය හැකිය . ඔබ IDisposable ක්‍රියාත්මක කරන සෑම විටම ඔබට එකම රටාව අනුගමනය කිරීමට අවශ්‍ය නමුත් ඔබ එකම මූලික කේතය සුළු වෙනස්කම් සහිතව ලිවීම හා නැවත ලිවීම අවසන් කරයි. විස්තාරණය කළ හැකි බැහැර කිරීමේ මිශ්‍රණයක් තිබුනේ නම්, ඔබට අමතර ටයිප් කිරීම ඉතිරි කර ගත හැකිය.

[2 සංස්කරණය කරන්න - ඔබගේ අනෙක් ප්‍රශ්නවලට පිළිතුරු දීමට]

බහුවිධ උරුමයෙන් මික්සින් වෙන් කරන්නේ කුමක් ද? එය අර්ථ නිරූපණය පිළිබඳ ප්‍රශ්නයක්ද?

ඔව්. මික්සින් සහ සම්මත බහු උරුමය අතර වෙනස අර්ථ නිරූපණය පිළිබඳ කාරණයක් පමණි; බහු උරුමයක් ඇති පංතියකට එම බහු උරුමයේ කොටසක් ලෙස මික්සින් භාවිතා කළ හැකිය.

මික්සින් එකක කාරණය නම්, උරුම වර්ගයට බලපෑමක් නොකර උරුමය හරහා වෙනත් ඕනෑම වර්ගයකට “මිශ්‍ර කළ හැකි” වර්ගයක් නිර්මාණය කිරීම සහ එම වර්ගයට යම් ප්‍රයෝජනවත් ක්‍රියාකාරිත්වයක් ලබා දීමයි.

නැවතත්, දැනටමත් ක්රියාත්මක කර ඇති අතුරු මුහුණතක් ගැන සිතන්න.

මම මූලික වශයෙන් ඒවාට සහය නොදක්වන භාෂාවකින් වර්ධනය වන බැවින් මම පෞද්ගලිකව මික්සින් භාවිතා නොකරමි, එබැවින් හොඳ ආදර්ශයක් ඉදිරිපත් කිරීම මට ඉතා අසීරු කාලයක් වේ. ඔබ වෙනුවෙන් මොහොතක්. නමුත් මම නැවත උත්සාහ කරමි. මම බොහෝ උදාහරණ භාවිතා කර ඇත - බොහෝ භාෂාවන් දැනටමත් යම් ආකාරයකින් හෝ වෙනත් ආකාරයකින් විශේෂාංගය ලබා දී ඇත - නමුත් එමඟින් මික්සින් නිර්මාණය කර භාවිතා කළ යුතු ආකාරය පැහැදිලි කරනු ඇත. මෙන්න:

ඔබට XML වෙත සහ ඉන් අනුක්‍රමික වීමට අවශ්‍ය වර්ගයක් ඇතැයි සිතමු. වර්ගයේ දත්ත අගයන් සමඟ එක්ස්එම්එල් කැබැල්ලක් අඩංගු නූලක් ආපසු ලබා දෙන "ටොක්ස්එම්එල්" ක්‍රමයක් සැපයීමට ඔබට අවශ්‍යය, සහ එක්ස්එම්එල් කැබැල්ලකින් දත්ත අගයන් ප්‍රතිනිර්මාණය කිරීමට වර්ගයට ඉඩ දෙන "ෆ්‍රොම්එක්ස්එම්එල්". නැවතත්, මෙය ව්‍යාකූල උදාහරණයකි, එබැවින් සමහර විට ඔබ ඔබේ භාෂාවේ ධාවන කාල පුස්තකාලයෙන් ගොනු ප්‍රවාහයක් හෝ XML ලේඛක පන්තියක් භාවිතා කරයි ... කුමක් වුවත්. කාරණය වන්නේ ඔබේ වස්තුව XML වෙත අනුක්‍රමික කිරීමට සහ XML වෙතින් නව වස්තුවක් ලබා ගැනීමට ඔබට අවශ්‍ය වීමයි.

මෙම උදාහරණයේ ඇති අනෙක් වැදගත් කරුණ නම් ඔබට මෙය සාමාන්‍ය ආකාරයකින් කිරීමට අවශ්‍ය වීමයි. ඔබට අනුක්‍රමික කිරීමට අවශ්‍ය සෑම වර්ගයක් සඳහාම “ToXML” සහ “FromXML” ක්‍රමයක් ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය නැත, ඔබේ වර්ගය මෙය කරනු ඇති බවට සහතික කිරීම සඳහා ඔබට යම් සාමාන්‍ය ක්‍රමයක් අවශ්‍ය වන අතර එය ක්‍රියාත්මක වේ. ඔබට කේත නැවත භාවිතා කිරීම අවශ්‍යයි.

ඔබේ භාෂාව එයට සහය දැක්වූයේ නම්, ඔබ වෙනුවෙන් ඔබේ වැඩ කටයුතු කිරීමට ඔබට XmlSerializable mixin නිර්මාණය කළ හැකිය. මෙම වර්ගය ToXML සහ FromXML ක්‍රම ක්‍රියාත්මක කරයි. එය, උදාහරණයට වැදගත් නොවන යම් යාන්ත්‍රණයක් භාවිතා කරමින්, ටොක්ස්එම්එල් විසින් ආපසු ලබා දෙන ලද එක්ස්එම්එල් කැබැල්ල තැනීම සඳහා එය මිශ්‍ර කර ඇති ඕනෑම වර්ගයකින් අවශ්‍ය සියලු දත්ත එක්රැස් කිරීමේ හැකියාව ඇති අතර, ෆ්‍රොම්එක්ස්එම්එල් වන විට එම දත්ත ප්‍රතිෂ් oring ාපනය කිරීමට සමානවම හැකියාව ඇත. කැඳවා.

හා .. එච්චරයි. එය භාවිතා කිරීම සඳහා, ඔබට එක්ස්එම්එල් වෙත අනුක්‍රමික කළ යුතු ඕනෑම වර්ගයක් XmlSerializable වෙතින් උරුම වේ. ඔබට එම වර්ගයට අනුක්‍රමිකකරණය කිරීමට හෝ අවශ්‍ය කිරීමට අවශ්‍ය වූ විට, ඔබ හුදෙක් ToXML හෝ FromXML අමතන්න. ඇත්ත වශයෙන්ම, XmlSerializable යනු අංගසම්පූර්ණ වර්ගයක් සහ බහුඅවයවිකතාවයක් වන බැවින්, ඔබේ මුල් වර්ගය ගැන කිසිවක් නොදන්නා ලේඛන අනුක්‍රමිකයක් ඔබට සිතාගත හැකිය, XmlSerializable වර්ග සමූහයක් පමණක් පිළිගනිමින්.

දැන් මෙම තත්වය වෙනත් දේ සඳහා භාවිතා කිරීම ගැන සිතා බලන්න, එය මිශ්‍ර කරන සෑම පන්තියක්ම සෑම ක්‍රමයක්ම ඇමතීම සහතික කරන මික්සින් එකක් හෝ එය මිශ්‍ර කරන වර්ගයට ගනුදෙනු සපයන මික්සින් එකක් වැනි ය. ලැයිස්තුවට ඉදිරියට යා හැකිය.

එම වර්ගයට වෙනත් ආකාරයකින් බලපෑමක් නොකර කුඩා ක්‍රියාකාරිත්වයක් කුඩා ප්‍රමාණයක් එකතු කිරීම සඳහා නිර්මාණය කර ඇති කුඩා පාදක වර්ගයක් ලෙස මික්සින් ගැන ඔබ සිතන්නේ නම්, ඔබ රන්වන් ය.

බලාපොරොත්තුවෙන්. :)


25
හේයි, ඔබ "බහුමාමක අනුනාදයක්" යන වාක්‍ය ඛණ්ඩයට කැමතිද? එය මා විසින්ම සාදන ලදී. මම සිතනවා. සමහර විට මම එය භෞතික විද්‍යාවේ කොතැනක හෝ අසා ඇති ...
රැන්ඩොල්ෆෝ

50
ඔබගේ පළමු වාක්‍යයට මම තරමක් එකඟ නොවෙමි. රූබි යනු තනි උරුම භාෂාවක් වන අතර, වෙනත් පන්තියකින් උරුම වූ පන්තියකට ක්‍රම එකතු කිරීමේ ක්‍රමය මික්සින් වේ.
කෙල්ටියා

23
El කෙල්ටියා: මම හිතන්නේ මික්සින් යනු අර්ථ දැක්වීම අනුව - බහු උරුමයයි. රූබි නඩුවේදී, ඔවුන් වඳුරු පැච් එකක් (හෝ වෙනත් දෙයක්) නිසි මිශ්‍රණයක් නොවේ. රූබි ජනතාව එය මික්සින් ලෙස හැඳින්විය හැකි නමුත් එය වෙනස් ආකාරයේ දෙයකි.
එස්.ලොට්

11
ඇත්ත වශයෙන්ම, සැබෑ මික්සින් කෙනෙකුට බහු උරුමයක් භාවිතා කළ නොහැක. මික්සින් වලට එක් පන්තියක සිට තවත් පන්තියකින් උරුම නොවී ක්‍රම, ගුණාංග ආදිය ඇතුළත් වේ. මෙය කේත නැවත භාවිතා කිරීමේ ප්‍රතිලාභ බහුමාපක ලෙස පෙනේ, නමුත් දෙමව්පියන්ගේ මරණයේ (මරණයේ දියමන්ති යනාදිය) තීරණය කිරීමේ ගැටළු මඟහරවා ගනී. අංශ දැන්).
ට්‍රෙවර්

8
වාර්තාව සඳහා, ජාවා දැන් පෙරනිමි ක්‍රම සමඟ මික්සින් සඳහා සහය දක්වයි.
shmosel

179

මෙම පිළිතුර මගින් උදාහරණ සමඟ මික්සින් පැහැදිලි කිරීම අරමුණු කරයි :

  • ස්වයං අන්තර්ගත : කෙටි, උදාහරණය තේරුම් ගැනීමට කිසිදු පුස්තකාලයක් දැන ගැනීමට අවශ්‍ය නැත.

  • පයිතන් භාෂාවෙන් මිස වෙනත් භාෂාවලින් නොවේ.

    එම භාෂාවල මෙම යෙදුම වඩාත් සුලභ බැවින් රූබි වැනි වෙනත් භාෂාවලින් උදාහරණ ඇති බව තේරුම් ගත හැකි නමුත් මෙය පයිතන් නූලකි.

එය මතභේදාත්මක ප්‍රශ්නය ද සලකා බලනු ඇත:

බහුවිධ උරුමයක් අවශ්‍යද නැත්නම් මික්සින් චරිතයක් නොවේද?

අර්ථ දැක්වීම්

පයිතන්හි මිශ්‍රණයක් යනු කුමක්දැයි පැහැදිලිව පවසන “බලයලත්” ප්‍රභවයකින් උපුටා දැක්වීමක් මා තවම දැක නැත.

මික්සින් සඳහා විය හැකි නිර්වචන 2 ක් මම දැක ඇත්තෙමි (ඒවා වියුක්ත පාදක පන්ති වැනි වෙනත් සමාන සංකල්පවලට වඩා වෙනස් ලෙස සැලකිය යුතු නම්), සහ කුමන ඒවා නිවැරදිද යන්න ජනතාව සම්පූර්ණයෙන්ම එකඟ නොවේ.

සම්මුතිය විවිධ භාෂා අතර වෙනස් විය හැකිය.

අර්ථ දැක්වීම 1: බහු උරුමයක් නොමැත

මික්සින් යනු පංතියක් වන අතර පන්තියේ සමහර ක්‍රමයක් පන්තියේ අර්ථ දක්වා නැති ක්‍රමයක් භාවිතා කරයි.

එබැවින් පංතිය ක්ෂණිකව දැක්වීමට නොව මූලික පංතියක් ලෙස සේවය කරයි. එසේ නොවුවහොත්, ව්‍යතිරේකයක් මතු නොකර ඇමතිය නොහැකි ක්‍රම තිබේ.

සමහර ප්‍රභවයන් එකතු කරන බාධකයක් නම් පන්තියේ දත්ත අඩංගු නොවිය හැකි බවයි, ක්‍රම පමණි, නමුත් මෙය අවශ්‍ය වන්නේ මන්දැයි මම නොදනිමි. කෙසේ වෙතත්, ප්‍රායෝගිකව, බොහෝ ප්‍රයෝජනවත් මික්සින් වලට දත්ත නොමැත, සහ දත්ත නොමැතිව මූලික පන්ති භාවිතා කිරීම පහසුය.

සම්භාව්‍ය නිදසුනක් නම්, සියලු සංසන්දනාත්මක ක්‍රියාකරුවන් පමණක් ක්‍රියාත්මක කිරීම <=සහ ==:

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 පන්ති මෝස්තර රටාව තුළ භාවිතා කිරීමට බලාපොරොත්තු වන අතර මූලික පන්ති අදහස් (කිවමනා ක්රමය භාවිතා කරන ඒවා, හෝ එය ක්රියාත්මක කල යුතු බව එම?)

දී ඇති පංතියක් මික්සින් ද නැද්ද යන්න තීරණය කිරීම පහසු නැත: මෙම ක්‍රමය ව්‍යුත්පන්න පංතිය මත පමණක් ක්‍රියාත්මක කළ හැකි අතර, එම අවස්ථාවේ දී අපි නැවත අර්ථ දැක්වීම 1 වෙත යමු. ඔබ කතුවරයාගේ අභිප්‍රායන් සලකා බැලිය යුතුය.

මෙම රටාව සිත්ගන්නාසුළු වන්නේ මූලික පන්තිවල විවිධ තේරීම් සමඟ ක්‍රියාකාරීත්වය නැවත ඒකාබද්ධ කළ හැකි බැවිනි:

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මික්සින් පන්ති ලෙස හැඳින්විය හැකි බවයි.

වෙනත් භාෂාවලින්

  • රූබි: ක්‍රමලේඛන රූබි සහ රූබි ක්‍රමලේඛන භාෂාව වැනි ප්‍රධාන යොමු පොත් වල සඳහන් කර ඇති පරිදි මික්සින් සඳහා බහු උරුමයක් අවශ්‍ය නොවන බව පැහැදිලිය.

  • C ++: virtualසකසා =0ඇති ක්‍රමයක් පිරිසිදු අථත්‍ය ක්‍රමයකි.

    අර්ථ දැක්වීම 1 වියුක්ත පංතියක නිර්වචනය සමඟ සමපාත වේ (පිරිසිදු අථත්‍ය ක්‍රමයක් ඇති පන්තියක්). එම පන්තිය ක්ෂණිකව කළ නොහැක.

    අථත්ය උරුමය සමඟ අර්ථ දැක්වීම 2 හැකි ය: ව්යුත්පන්න පන්ති දෙකකින් බහු උරුමය


41

මම හිතන්නේ ඒවා බහු උරුමයක් භාවිතා කිරීමේ විනයගරුක ක්‍රමයක් ලෙසයි - මක්නිසාද යත් මික්සින් යනු තවත් පයිතන් පංතියක් පමණක් වන අතර මික්සින් ලෙස හඳුන්වන පන්ති පිළිබඳ සම්මුතීන් අනුගමනය කළ හැකිය.

ඔබ මික්සින් ලෙස හඳුන්වන දෙයක් පාලනය කරන සම්මුතීන් පිළිබඳ මගේ අවබෝධය නම් මික්සින්:

  • ක්‍රම එකතු කරන නමුත් නිදර්ශන විචල්‍ය නොවේ (පන්ති නියතයන් හරි)
  • object(පයිතන් වලින්) උරුම වන්නේ

එමගින් එය බහු උරුමයේ විභව සංකීර්ණතාව සීමා කරන අතර, ඔබ බැලිය යුතු ස්ථානය සීමා කිරීමෙන් (සම්පූර්ණ බහු උරුමයට සාපේක්ෂව) ඔබේ වැඩසටහනේ ප්‍රවාහය නිරීක්ෂණය කිරීම සාධාරණ ලෙස පහසු කරයි. ඒවා රූබි මොඩියුල වලට සමානයි .

මට නිදර්ශන විචල්‍යයන් එක් කිරීමට අවශ්‍ය නම් (තනි උරුමයකින් ඉඩ දී ඇති ප්‍රමාණයට වඩා නම්‍යශීලී බවක් සහිතව) මම සංයුතිය සඳහා නැඹුරු වෙමි.

එසේ පැවසීමෙන් පසු, උදාහරණ විචල්‍යයන් ඇති XYZMixin නම් පන්ති මම දැක ඇත්තෙමි.


31

බහුවිධ උරුමයෙන් මික්සින් වෙන් කරන්නේ කුමක් ද? එය අර්ථ නිරූපණය පිළිබඳ ප්‍රශ්නයක්ද?

මික්සින් යනු බහු උරුමයක සීමිත ආකාරයකි. සමහර භාෂාවල පන්තියකට මික්සින් එකතු කිරීමේ යාන්ත්‍රණය උරුමයට වඩා තරමක් වෙනස් ය (වාක්‍ය ඛණ්ඩයට අනුව).

විශේෂයෙන් පයිතන්ගේ සන්දර්භය තුළ, මික්සින් යනු උප පංති සඳහා ක්‍රියාකාරීත්වය සපයන මව් පංතියකි, නමුත් එය ක්ෂණිකව ක්‍රියාත්මක කිරීමට අදහස් නොකෙරේ.

මික්සින් සඳහා ව්‍යාකූල විය හැකි පංතිය සැබවින්ම ක්ෂණිකව භාවිතා කර භාවිතා කළ හැකි නම්, “එය බහුවිධ උරුමයක් මිස සැබවින්ම මික්සින් නොවේ” යැයි ඔබට පැවසීමට හේතු විය හැකිය - එබැවින් ඇත්ත වශයෙන්ම එය අර්ථකථන හා සැබෑ සැබෑ වෙනසක් වේ.

බහු උරුමයේ උදාහරණය

ප්‍රලේඛනයෙන් මෙම උදාහරණය ඇණවුම් කළ ගණනයකි:

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 සහ OrderedDictසිට කරයිcollections මොඩියුලයේ .

දෙකම CounterසහOrderedDict ඒවා ක්ෂණිකව භාවිතා කිරීමට අදහස් කර ඇත. කෙසේ වෙතත්, ඒවා දෙකම උප වර්ගීකරණය කිරීමෙන්, අපට ඇණවුම් කරන ලද කවුන්ටරයක් ​​තිබිය හැකි අතර එක් එක් වස්තුවෙහි කේතය නැවත භාවිතා කරයි.

කේතය නැවත භාවිතා කිරීම සඳහා මෙය ප්‍රබල ක්‍රමයක් වන නමුත් එය ගැටළු සහගත විය හැකිය. එක් වස්තුවක දෝෂයක් ඇති බව පෙනේ නම්, එය නොසැලකිලිමත්ව නිවැරදි කිරීමෙන් උප පංතියේ දෝෂයක් ඇතිවිය හැකිය.

මික්සින් සඳහා උදාහරණය

ඕක්ඩර්කවුන්ටර් වැනි සමුපකාර බහුවිධ උරුමයන්ට ඇති විය හැකි සම්බන්ධක ගැටළු නොමැතිව කේත නැවත භාවිතා කිරීමේ ක්‍රමය ලෙස මික්සින් සාමාන්‍යයෙන් ප්‍රවර්ධනය කෙරේ. ඔබ මික්සින් භාවිතා කරන විට, ඔබ දත්ත සමඟ තදින් බැඳී නැති ක්‍රියාකාරිත්වය භාවිතා කරයි.

ඉහත උදාහරණය මෙන් නොව, මික්සින් තනිවම භාවිතා කිරීමට අදහස් නොකෙරේ. එය නව හෝ වෙනස් ක්‍රියාකාරීත්වයක් සපයයි.

උදාහරණයක් ලෙස, පුස්තකාලයක් කිහිපයක් ඇත තුළ mixins socketserverපුස්තකාලය .

මෙම මිශ්‍ර පංති භාවිතයෙන් එක් එක් වර්ගයේ සේවාදායකයන්ගේ ව්‍යාජ හා නූල් සංස්කරණ නිර්මාණය කළ හැකිය. උදාහරණයක් ලෙස, ThreadingUDPServer නිර්මාණය කර ඇත්තේ පහත පරිදි ය:

class ThreadingUDPServer(ThreadingMixIn, UDPServer):
    pass

මිශ්‍ර කිරීමේ පන්තිය පළමුව පැමිණෙන්නේ එය UDPServer හි අර්ථ දක්වා ඇති ක්‍රමයක් අභිබවා යන බැවිනි. විවිධ ගුණාංග සැකසීම යටින් පවතින සේවාදායක යාන්ත්‍රණයේ හැසිරීමද වෙනස් කරයි.

මෙම අවස්ථාවෙහිදී, මික්සින් ක්‍රම මගින් ඇති ක්‍රම ඉක්මවා යයි 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()

සංක්ෂිප්ත උදාහරණයක්

මෙය බොහෝ දුරට නිරූපණ අරමුණු සඳහා වන මිශ්‍රණයකි - බොහෝ වස්තූන් මෙම repr හි ප්‍රයෝජනය ඉක්මවා පරිණාමය වනු ඇත:

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)

30

මික්සින් යනු ක්‍රමලේඛනයේ සංකල්පයක් වන අතර එය පන්තියේ ක්‍රියාකාරීත්වය සපයන නමුත් එය ක්ෂණිකකරණය සඳහා භාවිතා කිරීමට අදහස් නොකෙරේ. මික්සින්ස් හි ප්‍රධාන පරමාර්ථය වන්නේ තනිවම ක්‍රියාකාරීත්වය සැපයීමයි. මික්සින් වලට වෙනත් මික්සින් සමඟ උරුමයක් නොමැති නම් සහ රාජ්‍යයෙන් වැළකී සිටීම වඩාත් සුදුසුය. රූබි වැනි භාෂාවල direct ජු භාෂා සහය ඇතත් පයිතන් සඳහා එසේ නොවේ. කෙසේ වෙතත්, පයිතන් හි සපයා ඇති ක්‍රියාකාරීත්වය ක්‍රියාත්මක කිරීම සඳහා ඔබට බහු පන්තියේ උරුමයක් භාවිතා කළ හැකිය.

මික්සින් වල මූලික කරුණු අවබෝධ කර ගැනීම සඳහා මම මෙම වීඩියෝව http://www.youtube.com/watch?v=v_uKI2NOLEM නැරඹුවෙමි. ආරම්භකයකුට මික්සින්වල මූලික කරුණු සහ ඒවා ක්‍රියා කරන ආකාරය සහ ඒවා ක්‍රියාත්මක කිරීමේදී ඔබට ඇතිවිය හැකි ගැටලු තේරුම් ගැනීම බෙහෙවින් ප්‍රයෝජනවත් වේ.

විකිපීඩියාව තවමත් හොඳම ය: http://en.wikipedia.org/wiki/Mixin


11

මම හිතන්නේ මෙහි හොඳ පැහැදිලි කිරීම් කිහිපයක් ලැබී ඇති නමුත් මට අවශ්‍ය වූයේ තවත් ඉදිරිදර්ශනයක් සැපයීමට ය.

ස්කලා හි දී, මෙහි විස්තර කර ඇති පරිදි ඔබට මික්සින් කළ හැකි නමුත් ඉතා සිත්ගන්නා කරුණ නම්, මික්සින් සැබවින්ම 'විලයනය' වී ඇති අතර එයින් උරුම වීමට නව ආකාරයේ පන්තියක් නිර්මාණය වේ. සාරාංශයක් ලෙස, ඔබ බහු පංති / මික්සින් වලින් උරුම නොවී, ඒ වෙනුවට, මික්සින්හි සියලු ගුණාංගයන්ගෙන් උරුම වීමට නව ආකාරයේ පන්තියක් ජනනය කරන්න. ස්කලා පදනම් වී ඇත්තේ ජේවීඑම් මත වන බැවින් බහු-උරුමය දැනට සහාය නොදක්වන බැවින් මෙය අර්ථවත් කරයි (ජාවා 8 අනුව). මෙම මික්සින් පන්තියේ වර්ගය, විශේෂ වර්ගයකි.

පංතියක් නිර්වචනය කර ඇති ආකාරයට එය ඉඟි කර ඇත: පංතිය නිව් ක්ලාස් ෆස්ට්මික්සින් දෙවන මික්සින් සමඟ තෙවන මික්සින් සමඟ විහිදේ ...

CPython පරිවර්තකය එයම කරයිදැයි මට විශ්වාස නැත (මික්සින් පන්ති සංයුතිය) නමුත් මම පුදුම නොවෙමි. එසේම, C ++ පසුබිමකින් එන මම, මික්සින් එකකට සමාන ABC හෝ 'අතුරුමුහුණතක්' නොකියමි - එය සමාන සංකල්පයක් වන නමුත් භාවිතයේ සහ ක්‍රියාත්මක කිරීමේදී වෙනස් වේ.


9

නව පයිතන් කේතයේ මිශ්‍ර කිරීම් වලට එරෙහිව මම ඔබට උපදෙස් දෙමි, ඔබට එය වටා වෙනත් මාර්ගයක් සොයාගත හැකි නම් (උරුමය වෙනුවට සංයුතිය වෙනුවට, හෝ ඔබේ පන්තිවලට වඳුරන් ඇල්ලීමේ ක්‍රම වැනි) ඊට වඩා වැඩි නොවේ. උත්සාහය.

පැරණි පන්තියේ පන්ති වලදී ඔබට වෙනත් පන්තියකින් ක්‍රම කිහිපයක් උදුරා ගැනීමේ ක්‍රමයක් ලෙස මිශ්‍ර කිරීම් භාවිතා කළ හැකිය. නමුත් නව විලාසිතාවේ ලෝකයේ සෑම දෙයක්ම, මිශ්‍ර වීම පවා උරුම වේ object. ඒ කියන්නේ බහු උරුමයක් භාවිතා කිරීම ස්වභාවිකවම MRO ගැටළු හඳුන්වා දෙයි .

පයිතන් හි බහු උරුම MRO වැඩ කිරීමට ක්‍රම තිබේ, විශේෂයෙන් සුපිරි () ශ්‍රිතය, නමුත් එයින් අදහස් කරන්නේ ඔබ ඔබේ මුළු පන්තියේ ධූරාවලියම සුපිරි () භාවිතා කළ යුතු අතර පාලනයේ ප්‍රවාහය තේරුම් ගැනීම සැලකිය යුතු ලෙස දුෂ්කර ය.


3
2.3 අනුවාදය පයිතන් 2.3 ක්‍රම විභේදන නියෝගය හෝ ක්‍රම විසර්ජන නියෝගයේ විස්තර කර ඇති “සී 3 ක්‍රම විභේදනය” භාවිතා කරයි .
වෙබ්වර්ස්ට්

11
පුද්ගලිකව, මම බොහෝ අවස්ථාවලදී වඳුරන් ඇල්ලීමට වඩා මික්සින් ගන්නෙමි; කේතය ගැන තර්ක කිරීම හා අනුගමනය කිරීම පහසුය.
tdammers

5
පහත් කොට ඇත. ඔබේ පිළිතුර සංවර්ධන ශෛලීන් පිළිබඳ වලංගු මතයක් ප්‍රකාශ කරන අතර, ඔබ ඇත්ත ප්‍රශ්නය ආමන්ත්‍රණය නොකරයි.
රයන් බී. ලින්ච්

9

සමහරවිට උදාහරණ කිහිපයක් උපකාරී වනු ඇත.

ඔබ පංතියක් ගොඩනඟන්නේ නම් සහ එය ශබ්ද කෝෂයක් ලෙස ක්‍රියා කිරීමට ඔබට අවශ්‍ය නම්, ඔබට විවිධාකාර අර්ථ දැක්විය හැකිය __ __ ගොඩනඟන්නේ ක්‍රම . නමුත් එය ටිකක් වේදනාවක්. විකල්පයක් ලෙස, ඔබට කිහිපයක් නිර්වචනය කළ හැකි අතර UserDict.DictMixin( වෙනත් ඕනෑම උරුමයකට අමතරව) ( collections.DictMixinpy3k වෙත ගෙනයනු ලැබේ ). Api හි ඇති සියලුම ශබ්දකෝෂ ස්වයංක්‍රීයව නිර්වචනය කිරීමේ බලපෑම මෙය සතු වේ.

දෙවන උදාහරණය: GUI මෙවලම් කට්ටලය wxPython ඔබට විවිධ තීරු සමඟ ලැයිස්තු පාලනය කිරීමට ඉඩ දෙයි (වින්ඩෝස් එක්ස්ප්ලෝරර් හි ගොනු සංදර්ශනය වැනි). පෙරනිමියෙන්, මෙම ලැයිස්තු තරමක් මූලික වේ. තීරු ශීර්ෂකය මත ක්ලික් කිරීමෙන්, නිශ්චිත තීරුවකින් ලැයිස්තුව වර්ග කිරීමට ඇති හැකියාව වැනි අමතර ක්‍රියාකාරිත්වයක් ඔබට එකතු කළ හැකිය, ListCtrl වෙතින් උරුම වී සුදුසු මික්සින් එකතු කිරීමෙන්.


9

එය පයිතන් උදාහරණයක් නොවේ, නමුත් ඩී ක්‍රමලේඛන භාෂාවෙන් මෙම පදය mixinභාවිතා කරනුයේ එකම ආකාරයකින් භාවිතා කරන ලද ඉදිකිරීමක් හැඳින්වීමට ය; පංතියකට දේවල් ගොඩක් එකතු කිරීම.

ඩී හි (කෙසේ වෙතත් එම්අයි නොකෙරේ) මෙය සිදු කරනුයේ අච්චුවක් ඇතුළත් කිරීමෙනි (කෘතිමව දැනුවත්ව හා ආරක්ෂිත මැක්‍රෝස් සිතන්න, ඔබ සමීප වනු ඇත) විෂය පථයට. පංතියක, ව්‍යුහයක, ශ්‍රිතයක, මොඩියුලයක හෝ ඕනෑම ප්‍රකාශ ගණනකට පුළුල් කිරීමට ඕනෑම කේත පේළියක් සඳහා මෙය ඉඩ දෙයි.


2
මික්සින් යනු ඩී, රූබි යනාදියෙහි භාවිතා වන සාමාන්‍ය යෙදුමකි. විකිපීඩියාවට අනුව, ඒවා පැරණි පාසල් තොල් පද්ධති වලින් ආරම්භ වූ අතර ඒවා ප්‍රථම වරට ලේඛනගත කරන ලද්දේ 1983 දී ය: en.wikipedia.org/wiki/…
ලී බී

8

මම හිතන්නේ කලින් ප්‍රතිචාර මගින් මික්ස් ඉන් යනු කුමක්ද යන්න මැනවින් අර්ථ දක්වා ඇත. කෙසේ වෙතත්, ඒවා වඩා හොඳින් අවබෝධ කර ගැනීම සඳහා, MixIns වියුක්ත පන්ති සහ අතුරුමුහුණත් සමඟ සංසන්දනය කිරීම ප්‍රයෝජනවත් විය හැකිය , කේත / ක්‍රියාත්මක කිරීමේ දෘෂ්ටිකෝණයෙන් :

1. වියුක්ත පන්තිය

  • වියුක්ත ක්‍රම එකක් හෝ කිහිපයක් අඩංගු විය යුතු පන්තිය

  • වියුක්ත පන්තියට රාජ්‍ය (නිදර්ශන විචල්‍ය) සහ වියුක්ත නොවන ක්‍රම අඩංගු විය හැකිය

2. අතුරුමුහුණත

  • අතුරුමුහුණතේ අඩංගු වන්නේ වියුක්ත ක්‍රම පමණි (වියුක්ත නොවන ක්‍රම සහ අභ්‍යන්තර තත්වයක් නොමැත)

3. මික්ස් ඉන්

  • MixIns (අතුරුමුහුණත් වැනි) අභ්‍යන්තර තත්වය අඩංගු නොවේ (නිදර්ශන විචල්‍ය)
  • MixIns හි වියුක්ත නොවන ක්‍රම එකක් හෝ කිහිපයක් අඩංගු වේ (ඒවාට අතුරු මුහුණත් මෙන් නොව වියුක්ත නොවන ක්‍රම අඩංගු විය හැකිය )

උදා: පයිතන්හි මේවා සම්මුතීන් පමණි, මන්ද ඉහත සියල්ලම classඑස් ලෙස අර්ථ දක්වා ඇත . කෙසේ වෙතත්, දෙකම පොදු ලක්ෂණය සාරාංශයේ ටියුශන් පන්ති, අතුරුමුහුණත් හා MixIns ඔවුන් ඇත නොකළ යුතුය තමන්ගේ මත පවතී, එනම්, instantiated නොකළ යුතුය.


7

OP සඳහන් කළේ C ++ හි මික්සින් ගැන ඔහු / ඇය කිසි විටෙකත් අසා නැති බවයි. සමහර විට ඒ C ++ හි කුතුහලයෙන් පුනරාවර්තන ආකෘති රටාව (CRTP) ලෙස හැඳින්වෙන නිසා විය හැකිය. සී ++ හි වියුක්ත පාදක පන්තිය හරහා මික්සින් ක්‍රියාත්මක කරන බව i සීරෝ සැන්ටිලි සඳහන් කළේය. මික්සින් ක්‍රියාවට නැංවීම සඳහා වියුක්ත පාදක පන්තිය භාවිතා කළ හැකි වුවද, ධාවන වේලාවේදී අථත්‍ය ක්‍රියාකාරිත්වයේ ක්‍රියාකාරීත්වය ක්‍රියාකාරී වේලාවේදී අථත්‍ය වගු විමසුමට ඉහළින් තොරව සම්පාදක වේලාවේදී අච්චුව භාවිතා කර සාක්ෂාත් කරගත හැකිය.

CRTP රටාව මෙහි විස්තරාත්මකව විස්තර කෙරේ

I සයිරෝ සැන්ටිලිගේ පිළිතුරෙහි ඇති පයිතන් උදාහරණය පහත අච්චු පන්තිය භාවිතයෙන් සී ++ බවට පරිවර්තනය කර ඇත:

    #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;
}

සංස්කරණය කරන්න: සංසන්දනාත්මක මික්සින් හි ආරක්ෂිත ඉදිකිරීම්කරුවෙකු එකතු කරන ලද අතර එමඟින් එය උරුම කර ගත හැකි අතර ක්ෂණිකව නොවේ. සංසන්දනාත්මක මික්සින් වස්තුවක් නිර්මාණය කළ විට ආරක්ෂිත ඉදිකිරීම්කරු සම්පාදක දෝෂයක් ඇති කරන්නේ කෙසේදැයි පෙන්වීමට උදාහරණය යාවත්කාලීන කරන ලදි.


මික්සින් සහ සීආර්ටීපී සී ++ හි එකම දේ නොවේ.
ashrasmun

6

සමහර විට රූබි වලින් උදාහරණයක් උපකාරී වේ:

ඔබට මික්සින් ඇතුළත් කර Comparableඑක් ශ්‍රිතයක් අර්ථ දැක්විය හැකිය "<=>(other)", මික්සින් එම සියලු කාර්යයන් සපයයි:

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

එය සිදු කරන්නේ <=>(other)නිවැරදි ප්‍රති .ල ලබා දීමෙන් ය.

"instance <=> other"වස්තූන් දෙකම සමාන නම් 0 ට වඩා අඩු නම්, 0 ට වඩා instanceවිශාල නම් 0 ට වඩා විශාල නම් otherසහ 0 ට වඩා otherවිශාල නම් .


මෙන්න පයිතන් සඳහා සමාන මිශ්‍රණයක් සපයන පෝස්ට් එකක්. යෝජනාව __lt__වෙනුවට පදනමක් ලෙස අර්ථ දැක්වුවද __cmp__, දෙවැන්න ඇත්ත වශයෙන්ම අතහැර දමා භාවිතය අධෛර්යමත් කරයි. මට එය තරමක් සංකීර්ණ වෙනුවට බව mixin භාවිතා කිරීමට, සරල බව පෙනේ සැරසිළි (කොටසක් functools ) - නමුත් මේ එක වැඩි ගතිකව ප්රතික්රියා කිරීමට හැකි වනු ඇත කරන සැසඳීම් ලබා ඇත ...
තෝබියස් Kienzler

6

මික්සින් පන්තියක ක්‍රියාකාරිත්වය එක් කිරීමට ක්‍රමයක් ලබා දෙයි, එනම් මොඩියුලය තුළ අර්ථ දක්වා ඇති ක්‍රම සමඟ අන්තර්ක්‍රියා කිරීමට ඔබට අවශ්‍ය පන්තිය තුළ මොඩියුලය ඇතුළත් කළ හැකිය. රූබී බහු උරුමයට සහාය නොදක්වන නමුත් එය සාක්ෂාත් කර ගැනීම සඳහා විකල්පයක් ලෙස මික්සින් සපයයි.

මික්සින් භාවිතයෙන් බහු උරුමයක් ලබා ගන්නේ කෙසේද යන්න පැහැදිලි කරන උදාහරණයක් මෙන්න.

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 සහ mixin TestBase වැනි නවීකරණය නොකළ මිලිටර් යෙදුමක් ගන්න:

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


3

ඔබට # පසුබිමක් ඇති බව මම කියෙව්වා. එබැවින් හොඳ ආරම්භක ස්ථානයක් .NET සඳහා මික්සින් ක්‍රියාත්මක කිරීම විය හැකිය.

ඔබට කෝඩ්ප්ලෙක්ස් ව්‍යාපෘතිය http://remix.codeplex.com/ හි පරීක්ෂා කිරීමට අවශ්‍ය විය හැකිය.

දළ විශ්ලේෂණයක් ලබා ගැනීම සඳහා lang.net සම්මන්ත්‍රණ සබැඳිය බලන්න. කෝඩ්ප්ලෙක්ස් පිටුවේ ලේඛනගත කිරීම සඳහා තව බොහෝ දේ ඇත.

ස්ටෙෆාන් ගැන

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.