පංති ප්රකාශයකින් උරුම වීමට හේතුවක් objectතිබේද?
මෙය සිදු කරන කේත කිහිපයක් මට හමු වූ අතර එයට හොඳ හේතුවක් සොයාගත නොහැක.
class MyClass(object):
# class code follows...
පංති ප්රකාශයකින් උරුම වීමට හේතුවක් objectතිබේද?
මෙය සිදු කරන කේත කිහිපයක් මට හමු වූ අතර එයට හොඳ හේතුවක් සොයාගත නොහැක.
class MyClass(object):
# class code follows...
Answers:
පංති ප්රකාශයකින් උරුම වීමට හේතුවක්
objectතිබේද?
පයිතන් 3 සහ, පයිතන් 2 සහ 3 අතර අනුකූලතාවයට අමතරව, කිසිදු හේතුවක් නැත . පයිතන් 2 හි බොහෝ හේතු .
පයිතන් 2.x හි (2.2 සිට) objectමූලික පන්තියක් ලෙස සිටීම හෝ නොපැවතීම මත පදනම්ව පන්ති විලාස දෙකක් ඇත :
"සම්භාව්ය" විලාසිතාවේ පන්ති: ඒවාට objectමූලික පන්තියක් ලෙස නොමැත:
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()"නව" ශෛලීය පංති: ඒවාට මූලික පන්තියක් ලෙස සෘජුව හෝ වක්රව (උදා: සාදන ලද වර්ගයකින් උරුම වේ ) object:
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(<type 'object'>,)පංතියක් ලිවීමේදී ඔබට සැමවිටම නව විලාසිතාවේ පන්ති සඳහා යාමට අවශ්ය වනු ඇති බවට සැකයක් නැත . ඒවායින් සමහරක් ලැයිස්තුගත කිරීම සඳහා එසේ කිරීමේ වරප්රසාද බොහෝ ය:
විස්තර කරන්නන් සඳහා සහාය . විෙශේෂෙයන්ම, පහත සඳහන් ඉදිකිරීම් විස්තර කරන්නන් සමඟ කළ හැකි ය:
classmethod: උදාහරණය වෙනුවට ව්යාජ තර්කයක් ලෙස පන්තිය ලබා ගන්නා ක්රමයක්.staticmethod: selfපළමු තර්කය ලෙස ව්යංග තර්කය නොලැබෙන ක්රමයක් .property: ගුණාංගයක් ලබා ගැනීම, සැකසීම සහ මකා දැමීම කළමනාකරණය කිරීම සඳහා කාර්යයන් සාදන්න.__slots__: පන්තියක මතක පරිභෝජනය ඉතිරි කරන අතර වේගවත් ආරෝපණ ප්රවේශයටද හේතු වේ. ඇත්ත වශයෙන්ම, එය සීමාවන් පනවයි .මෙම __new__ස්ථිතික ක්රමය: ඔබට නව පන්ති අවස්ථා නිර්මාණය වී ඇති ආකාරය රිසිකරණය කිරීමට ඉඩ දෙයි.
ක්රම විභේදන අනුපිළිවෙල (MRO) : කුමන ක්රමයට ඇමතිය යුතුද යන්න නිරාකරණය කිරීමට උත්සාහ කරන විට පන්තියක මූලික පන්ති සොයන්නේ කුමන අනුපිළිවෙලටද?
MRO හා සම්බන්ධ, superඇමතුම් . ද බලන්න, super()කල්පනාකාරීව සුපිරි.
ඔබට උරුම නොවන්නේ නම් object, මේවා අමතක කරන්න. පෙර වෙඩි නොවදින ස්ථාන පිළිබඳ වඩාත් සවිස්තරාත්මක විස්තරයක් සහ “නව” විලාසිතාවේ පන්තිවල වෙනත් වරප්රසාද මෙහි සොයාගත හැකිය .
නව විලාසිතාවේ පන්තිවල අවාසිය නම් පන්තියම වැඩි මතක ශක්තියක් තිබීමයි. ඔබ බොහෝ පන්ති වස්තූන් නිර්මාණය නොකරන්නේ නම්, මෙය ප්රශ්නයක් වනු ඇති බවටත් එය ධනාත්මක මුහුදේ ගිලී යාම negative ණාත්මක බවත් මම සැක කරමි.
පයිතන් 3 හි, දේවල් සරල කර ඇත. නව විලාසිතාවේ පන්ති පමණක් පවතී (පැහැදිලිවම පන්ති ලෙස හැඳින්වේ) එබැවින්, එකතු කිරීමේ එකම වෙනස objectවන්නේ ඔබට තවත් අක්ෂර 8 ක් ටයිප් කිරීමට අවශ්ය වීමයි. මෙය:
class ClassicSpam:
pass
සම්පූර්ණයෙන්ම සමාන වේ (ඔවුන්ගේ නම හැර :-) මේ සඳහා:
class NewSpam(object):
pass
සහ මේ සඳහා:
class Spam():
pass
සියල්ලටම ඒවා objectතිබේ __bases__.
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
පයිතන් 2 හි: සෑම විටම objectපැහැදිලිවම උරුම වන්න . වරප්රසාද ලබා ගන්න.
Python 3: සිට උරුම objectඔබ උත්සාහක දිනුම් බව ය Python අඥේයවාදියෙක්, විය යුතු බව කේතය ලියන නම්, එය Python 2 හා Python 3. දෙකම වැඩ කිරීමට අවශ්ය නැත්නම්, එය ඇත්තෙන්ම කිසි වෙනසක් Python ඔබට එය ඇතුල් සිට කරයි නැහැ තිරය පිටුපස.
object. IIRC හි නව මාදිලියේ පන්ති සඳහා තවමත් සියලුම බිල්ඩින් වර්ග නොතිබූ ස්ථානයක් තිබුණි.
objectබවයි. මා සතුව පයිතන් 2.2.3 ක් ඇති අතර ඉක්මන් පරීක්ෂණයකින් පසු මට වැරදිකරුවෙකු සොයාගත නොහැකි විය, නමුත් එය වඩාත් පැහැදිලි කිරීම සඳහා මම පසුව පිළිතුර නැවත කියමි. ඔබට උදාහරණයක් සොයා ගත හැකි නම්, මගේ කුතුහලය ඇවිස්සී ඇත.
object.
staticmethodහා classmethodපවා පැරණි ශෛලිය පන්ති මත දැන් හොදින් වැඩ කරයි. propertyවර්ග කිරීම පැරණි විලාසිතාවේ පන්ති කියවීම සඳහා ක්රියා කරයි , එය ලිවීම් වලට බාධා කිරීමට අසමත් වේ (එබැවින් ඔබ නමට පවරන්නේ නම්, උදාහරණය මඟින් දේපල සෙවනැලි කරන ලද නමෙහි ලක්ෂණයක් ලබා ගනී). __slots__ප්රවේශවීමේ වේගය ආරෝපණය කිරීම වැඩිදියුණු කිරීම බොහෝ දුරට නව විලාසිතාවේ පන්තියේ ආරෝපණ ප්රවේශයට සිදුවන පාඩුව අහෝසි කිරීම බව සලකන්න , එබැවින් එය සැබවින්ම නව විලාසිතාවේ පන්තිවල විකුණුම් ස්ථානයක් නොවේ (මතක ඉතිරිකිරීම් යනු විකුණුම් ලක්ෂ්යයකි).
පයිතන් 3
class MyClass(object): = නව විලාසිතාවේ පන්තියclass MyClass:= නව විලාසිතාවේ පන්තිය (ව්යංගයෙන් උරුම වන්නේ object)පයිතන් 2
class MyClass(object): = නව විලාසිතාවේ පන්තියclass MyClass:= පැරණි ශෛලමය පන්තියපැහැදිලි කිරීම :
පයිතන් 3.x හි මූලික පන්ති නිර්වචනය කරන විට, ඔබට එය අතහැර දැමීමට අවසර ඇත object අර්ථ දැක්වීමෙන් . කෙසේ වෙතත්, මෙය බරපතල ලෙස ගැටළුවක් සොයා ගැනීමට දොර විවර කළ හැකිය…
පයිතන් නව විලාසිතාවේ පන්ති නැවත පයිතන් 2.2 හි හඳුන්වා දුන් අතර මේ වන විට පැරණි විලාසිතාවේ පන්ති සැබවින්ම පැරණි ය. පැරණි පන්තියේ පන්ති පිළිබඳ සාකච්ඡාව 2.x ලේඛනයේ තැන්පත් කර ඇත අතර 3.x ලියකියවිලි වල නොපවතී.
ගැටළුව වන්නේ, පයිතන් 2.x හි පැරණි විලාසිතාවේ පන්ති සඳහා වන වාක්ය ඛණ්ඩය පයිතන් 3.x හි නව විලාසිතාවේ පන්ති සඳහා විකල්ප වාක්ය ඛණ්ඩයට සමාන වේ. වේ. පයිතන් 2.x තවමත් ඉතා පුළුල් ලෙස භාවිතා වේ (උදා: GAE, Web2Py), සහ ඕනෑම කේතයක් (හෝ කෝඩරයක්) නොදැනුවත්ව 3.x විලාසිතාවේ පන්ති අර්ථ දැක්වීම් 2.x කේතයට ගෙන ඒම බරපතල ලෙස යල් පැන ගිය මූලික වස්තු සමඟ අවසන් වේ. පැරණි විලාසිතාවේ පන්ති කිසිවෙකුගේ රේඩාර් මත නොමැති නිසා, ඔවුන්ට පහර දුන්නේ කුමක් දැයි ඔවුන් නොදැන සිටිති.
ඒ නිසා එය දිගු දුරක් අක්ෂර වින්යාසය සහ 2.x සංවර්ධකයාගේ කඳුළු සුරකින්න.
__metaclass__ = typeමොඩියුලයේ ඉහළින් තබමි ( from __future__ import absolute_import, division, print_functionපේළියට පසු :-)); එය Py2 හි අනුකූලතා හැක් එකක් වන අතර එමඟින් මොඩියුලයේ පසුව නිර්වචනය කරන ලද සියලුම පන්ති පෙරනිමියෙන් නව විලාසිතාවක් බවට පත් කරයි, සහ Py3 හි එය සම්පූර්ණයෙන්ම නොසලකා හරිනු ලැබේ (අහඹු ගෝලීය විචල්යයක් වටා වාඩි වී සිටී), එබැවින් එය හානිකර නොවේ.
ඔව්, මෙය 'නව විලාසිතාවේ' වස්තුවකි. එය python2.2 හි හඳුන්වා දුන් ලක්ෂණයකි.
නව විලාසිතාවේ වස්තූන් සම්භාව්ය වස්තූන් සඳහා වෙනස් වස්තු ආකෘතියක් ඇති අතර සමහර දේවල් පැරණි විලාසිතාවේ වස්තූන් සමඟ නිසියාකාරව ක්රියා නොකරනු ඇත. super() , @propertyසහ විස්තර කරන්නන්. නව විලාසිතාවේ පන්තියක් යනු කුමක්ද යන්න පිළිබඳ හොඳ විස්තරයක් සඳහා මෙම ලිපිය බලන්න .
වෙනස්කම් විස්තර කිරීම සඳහා SO සබැඳිය: පයිතන් හි පැරණි විලාසිතාව සහ නව විලාසිතාවේ පන්ති අතර වෙනස කුමක්ද?
objectයුත්තේ පයිතන් 2 හි පමණි.
සිට ඉතිහාසය Python ඉගෙන ගන්න දෙන ආකාරය :
පයිතන්ගේ පංතියේ මුල් පිටපත බොහෝ බරපතල ආකාරවලින් කැඩී ගියේය. මෙම දෝෂය හඳුනාගන්නා විට එය දැනටමත් ප්රමාද වී ඇති අතර ඔවුන්ට එයට සහාය වීමට සිදුවිය. ගැටළුව නිරාකරණය කිරීම සඳහා, ඔවුන්ට "නව පංති" ශෛලියක් අවශ්ය වූ අතර එමඟින් "පැරණි පංති" දිගටම ක්රියාත්මක වන නමුත් ඔබට නව වඩාත් නිවැරදි අනුවාදය භාවිතා කළ හැකිය.
පංතියක් සෑදීම සඳහා ඔබට උරුම වූ "පංතිය" ලෙස ඔවුන් "වස්තුව" යන වචනය භාවිතා කරන බව ඔවුන් තීරණය කළහ. එය අවුල් සහගත ය, නමුත් පංතියක් සෑදීම සඳහා "වස්තුව" නම් පන්තියෙන් පන්තියක් උරුම වන නමුත් එය වස්තුවක් ඇත්ත වශයෙන්ම එහි පන්තියක් නොවේ, නමුත් වස්තුවෙන් උරුම වීමට අමතක නොකරන්න.
නව විලාසිතාවේ පන්ති සහ පැරණි විලාසිතාවේ පන්ති අතර වෙනස කුමක්දැයි ඔබට දැන ගැනීමට නම්, නව විලාසිතාවේ පන්ති සෑම විටම objectපන්තියෙන් හෝ වෙනත් පන්තියකින් උරුම වී ඇත object:
class NewStyle(object):
pass
තවත් උදාහරණයක්:
class AnotherExampleOfNewStyle(NewStyle):
pass
පැරණි විලාසිතාවේ මූලික පන්තියක් මේ ආකාරයට පෙනේ:
class OldStyle():
pass
පැරණි පන්තියේ ළමා පන්තියක් මේ වගේ ය:
class OldStyleSubclass(OldStyle):
pass
පරණ විලාසිතාවේ පාදක පන්තිය වෙනත් පන්තියකින් උරුම නොවන බව ඔබට පෙනේ, කෙසේ වෙතත්, පැරණි විලාසිතාවේ පන්තිවලට ඇත්ත වශයෙන්ම එකිනෙකාගෙන් උරුම විය හැකිය. සෑම පයිතන් පන්තියකම නිශ්චිත ක්රියාකාරිත්වයක් ඇති බව වස්තුවෙන් උරුම කර ගැනීම සහතික කරයි. පයිතන් 2.2 හි නව විලාසිතාවේ පන්ති හඳුන්වා දෙන ලදී
objectඑතරම් ව්යාකූල නොවන අතර ඇත්ත වශයෙන්ම එය තරමක් ප්රමිතියකි. ස්මාල්ටෝක් හි මූල පංතියක් නම් Objectකර ඇති අතර මූල මෙටැක්ලාස් නම් කර Classඇත. මන්ද? මන්ද, Dogබල්ලන් Objectසඳහා පන්තියක් මෙන්ම, වස්තූන් සඳහා පන්තියක් ද, Classපන්ති සඳහා පන්තියක් ද වේ. ජාවා, සී #, ඕබ්සීසී, රූබි සහ වෙනත් බොහෝ පංති පාදක ඕඕ භාෂාවන් අද භාවිතා කරන මූල පංතියක් Objectඇති පයිතන් පමණක් නොව නම ලෙස යම් වෙනස්කමක් භාවිතා කරයි .
ඔව්, එය .තිහාසිකයි . එය නොමැතිව, එය පැරණි විලාසිතාවේ පන්තියක් නිර්මාණය කරයි.
ඔබ type()පරණ විලාසිතාවේ වස්තුවක් භාවිතා කරන්නේ නම් , ඔබට "නිදසුනක්" ලැබේ. නව විලාසිතාවේ වස්තුවක් මත ඔබට එහි පන්තිය ලැබේ.
type()පැරණි විලාසිතාවේ පන්තියක් භාවිතා කරන්නේ නම් , ඔබට "වර්ගය" වෙනුවට "classobj" ලැබේ.
පන්ති නිර්මාණය කිරීමේ ප්රකාශයේ වාක්ය ඛණ්ඩය:
class <ClassName>(superclass):
#code follows
ඔබට විශේෂයෙන් උරුම කර ගැනීමට අවශ්ය වෙනත් සුපිරි පන්ති නොමැති විට, superclassසෑම විටම විය යුත්තේ objectපයිතන්හි සියලුම පන්තිවල මුලයි.
objectතාක්ෂණික වශයෙන් පයිතන් හි "නව විලාසිතාවේ" පන්ති වල මුල වේ. නමුත් අද දින නව විලාසිතාවේ පන්ති එකම පන්ති පන්තිය තරම්ම හොඳයි.
එහෙත්, ඔබ objectපන්ති නිර්මාණය කිරීමේදී වචනය පැහැදිලිවම භාවිතා නොකරන්නේ නම්, අනෙක් අය සඳහන් කළ පරිදි, පයිතන් 3.x ව්යංගයෙන් උරුම වන්නේobject . නමුත් මම අනුමාන කිරීම නිරපේක්ෂ (නිරයට) වඩා හොඳ යැයි සිතමි