පයිතන් පන්තියට වස්තුව උරුම වේ


1275

පංති ප්‍රකාශයකින් උරුම වීමට හේතුවක් objectතිබේද?

මෙය සිදු කරන කේත කිහිපයක් මට හමු වූ අතර එයට හොඳ හේතුවක් සොයාගත නොහැක.

class MyClass(object):
    # class code follows...


120
මෙම ප්‍රශ්නයට පිළිතුර (සරල වුවත්) සොයා ගැනීම තරමක් අපහසුය. "පයිතන් වස්තු පාදක පන්තිය" හෝ ඒ හා සමාන දේවල් ගූගල් කිරීම මඟින් වස්තු නැඹුරු වැඩසටහන්කරණය පිළිබඳ පිටු සහ නිබන්ධන පිටු සමඟ පැමිණේ. ඉහළ නැංවීම "පැරණි එදිරිව නව විලාසිතාවේ පයිතන් වස්තු" යන සෙවුම් පද වෙත මා යොමු කළ පළමු සබැඳිය මෙයයි
vastlysuperiorman

Answers:


798

පංති ප්‍රකාශයකින් උරුම වීමට හේතුවක් objectතිබේද?

පයිතන් 3 සහ, පයිතන් 2 සහ 3 අතර අනුකූලතාවයට අමතරව, කිසිදු හේතුවක් නැත . පයිතන් 2 හි බොහෝ හේතු .


පයිතන් 2.x කතාව:

පයිතන් 2.x හි (2.2 සිට) objectමූලික පන්තියක් ලෙස සිටීම හෝ නොපැවතීම මත පදනම්ව පන්ති විලාස දෙකක් ඇත :

  1. "සම්භාව්‍ය" විලාසිතාවේ පන්ති: ඒවාට objectමූලික පන්තියක් ලෙස නොමැත:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
  2. "නව" ශෛලීය පංති: ඒවාට මූලික පන්තියක් ලෙස සෘජුව හෝ වක්‍රව (උදා: සාදන ලද වර්ගයකින් උරුම වේ ) 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'>,)

පංතියක් ලිවීමේදී ඔබට සැමවිටම නව විලාසිතාවේ පන්ති සඳහා යාමට අවශ්‍ය වනු ඇති බවට සැකයක් නැත . ඒවායින් සමහරක් ලැයිස්තුගත කිරීම සඳහා එසේ කිරීමේ වරප්‍රසාද බොහෝ ය:

  • විස්තර කරන්නන් සඳහා සහාය . විෙශේෂෙයන්ම, පහත සඳහන් ඉදිකිරීම් විස්තර කරන්නන් සමඟ කළ හැකි ය:

    1. classmethod: උදාහරණය වෙනුවට ව්‍යාජ තර්කයක් ලෙස පන්තිය ලබා ගන්නා ක්‍රමයක්.
    2. staticmethod: selfපළමු තර්කය ලෙස ව්‍යංග තර්කය නොලැබෙන ක්‍රමයක් .
    3. ගුණාංග සමඟ property: ගුණාංගයක් ලබා ගැනීම, සැකසීම සහ මකා දැමීම කළමනාකරණය කිරීම සඳහා කාර්යයන් සාදන්න.
    4. __slots__: පන්තියක මතක පරිභෝජනය ඉතිරි කරන අතර වේගවත් ආරෝපණ ප්‍රවේශයටද හේතු වේ. ඇත්ත වශයෙන්ම, එය සීමාවන් පනවයි .
  • මෙම __new__ස්ථිතික ක්රමය: ඔබට නව පන්ති අවස්ථා නිර්මාණය වී ඇති ආකාරය රිසිකරණය කිරීමට ඉඩ දෙයි.

  • ක්‍රම විභේදන අනුපිළිවෙල (MRO) : කුමන ක්‍රමයට ඇමතිය යුතුද යන්න නිරාකරණය කිරීමට උත්සාහ කරන විට පන්තියක මූලික පන්ති සොයන්නේ කුමන අනුපිළිවෙලටද?

  • MRO හා සම්බන්ධ, superඇමතුම් . ද බලන්න, super()කල්පනාකාරීව සුපිරි.

ඔබට උරුම නොවන්නේ නම් object, මේවා අමතක කරන්න. පෙර වෙඩි නොවදින ස්ථාන පිළිබඳ වඩාත් සවිස්තරාත්මක විස්තරයක් සහ “නව” විලාසිතාවේ පන්තිවල වෙනත් වරප්‍රසාද මෙහි සොයාගත හැකිය .

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


පයිතන් 3.x කතාව:

පයිතන් 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 හි නව මාදිලියේ පන්ති සඳහා තවමත් සියලුම බිල්ඩින් වර්ග නොතිබූ ස්ථානයක් තිබුණි.
bruno desthuilliers

@brunodesthuilliers මගේ හැඟීම වූයේ සියලු සාදන ලද වර්ග උරුම වී ඇති objectබවයි. මා සතුව පයිතන් 2.2.3 ක් ඇති අතර ඉක්මන් පරීක්‍ෂණයකින් පසු මට වැරදිකරුවෙකු සොයාගත නොහැකි විය, නමුත් එය වඩාත් පැහැදිලි කිරීම සඳහා මම පසුව පිළිතුර නැවත කියමි. ඔබට උදාහරණයක් සොයා ගත හැකි නම්, මගේ කුතුහලය ඇවිස්සී ඇත.
ඩිමිට්‍රිස් ෆසරකිස් හිල්යාඩ්

සෑම අවංකකමකින්ම (මගේ පෙර අදහස් දැක්වීමේදී "IIRC") මට මේ කාරණය ගැන 101% ක් විශ්වාස නැත (තෙත් කළ සියලු බිල්ඩින් වර්ග දැනටමත් නව විලාසිතාවේ පන්ති බවට පරිවර්තනය කර ඇති විට නව විලාසිතාවේ පන්ති හඳුන්වා දී ඇත) - මම සරල විය හැකිය වැරදියි, නැතහොත් මෙය සමහර විට සම්මත ලිබ් (නමුත් බිල්ඩින් නොවේ) වර්ග කිහිපයක් ගැන පමණක් සැලකිලිමත් විය හැකිය. නමුත් මම සිතන්නේ නව විලාසිතාවේ පංතියක් එහි පදනම තුළ ඇති බව පැහැදිලි කිරීම වඩා හොඳ විය යුතු බවයි object.
bruno desthuilliers

7
ඉතා නරක ස්ටක් ඕවර් ප්‍රවාහය මෙම කාරුණික පිළිතුරු සඳහා upvote = upvote + 1 පමණක් කරයි, මට upvote + = N
PirateApp

1
staticmethodහා classmethodපවා පැරණි ශෛලිය පන්ති මත දැන් හොදින් වැඩ කරයි. propertyවර්ග කිරීම පැරණි විලාසිතාවේ පන්ති කියවීම සඳහා ක්‍රියා කරයි , එය ලිවීම් වලට බාධා කිරීමට අසමත් වේ (එබැවින් ඔබ නමට පවරන්නේ නම්, උදාහරණය මඟින් දේපල සෙවනැලි කරන ලද නමෙහි ලක්ෂණයක් ලබා ගනී). __slots__ප්‍රවේශවීමේ වේගය ආරෝපණය කිරීම වැඩිදියුණු කිරීම බොහෝ දුරට නව විලාසිතාවේ පන්තියේ ආරෝපණ ප්‍රවේශයට සිදුවන පාඩුව අහෝසි කිරීම බව සලකන්න , එබැවින් එය සැබවින්ම නව විලාසිතාවේ පන්තිවල විකුණුම් ස්ථානයක් නොවේ (මතක ඉතිරිකිරීම් යනු විකුණුම් ලක්ෂ්‍යයකි).
ෂැඩෝ රේන්ජර්

540

පයිතන් 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 සංවර්ධකයාගේ කඳුළු සුරකින්න.


13
"පයිතන් 3.x හි මූලික පංති නිර්වචනය කිරීමේදී, ඔබට අර්ථ දැක්වීමෙන් වස්තුව අතහැර දැමීමට අවසර ඇත. කෙසේ වෙතත්, මෙය බරපතල ලෙස ගැටළුවක් සොයා ගැනීමට දොර විවර කරයි ..." ඔබ යොමු කරන්නේ කුමන ගැටළු වලටද?
අයිඩිස්

6
Id ඒඩිස්: මම හිතන්නේ ඔවුන් අදහස් කරන්නේ Py2 සහ Py3 යන දෙකෙහිම ක්‍රියාත්මක වන කේතය Py3 මත හොඳ වනු ඇති නමුත් එය නව විලාසිතාවේ පන්ති අංග මත රඳා පවතී නම් Py2 මත බිඳ දැමිය හැකි බවයි. පුද්ගලිකව, මම එවැනි කේතයක් ලියන්නේ නම්, මම පැහැදිලි උරුමය අතහැර __metaclass__ = typeමොඩියුලයේ ඉහළින් තබමි ( from __future__ import absolute_import, division, print_functionපේළියට පසු :-)); එය Py2 හි අනුකූලතා හැක් එකක් වන අතර එමඟින් මොඩියුලයේ පසුව නිර්වචනය කරන ලද සියලුම පන්ති පෙරනිමියෙන් නව විලාසිතාවක් බවට පත් කරයි, සහ Py3 හි එය සම්පූර්ණයෙන්ම නොසලකා හරිනු ලැබේ (අහඹු ගෝලීය විචල්‍යයක් වටා වාඩි වී සිටී), එබැවින් එය හානිකර නොවේ.
ෂැඩෝ රේන්ජර්

400

ඔව්, මෙය 'නව විලාසිතාවේ' වස්තුවකි. එය python2.2 හි හඳුන්වා දුන් ලක්ෂණයකි.

නව විලාසිතාවේ වස්තූන් සම්භාව්‍ය වස්තූන් සඳහා වෙනස් වස්තු ආකෘතියක් ඇති අතර සමහර දේවල් පැරණි විලාසිතාවේ වස්තූන් සමඟ නිසියාකාරව ක්‍රියා නොකරනු ඇත. super() , @propertyසහ විස්තර කරන්නන්. නව විලාසිතාවේ පන්තියක් යනු කුමක්ද යන්න පිළිබඳ හොඳ විස්තරයක් සඳහා මෙම ලිපිය බලන්න .

වෙනස්කම් විස්තර කිරීම සඳහා SO සබැඳිය: පයිතන් හි පැරණි විලාසිතාව සහ නව විලාසිතාවේ පන්ති අතර වෙනස කුමක්ද?


110
+1 මෙය. පරණ විලාසිතාවේ පන්ති පයිතන් 3 හි නැති බව සලකන්න, එබැවින් ඔබට උරුම විය objectයුත්තේ පයිතන් 2 හි පමණි.

9
මෙය සැබෑ පිළිතුරක් නොවේ. Other වෙනත් ලිපි ගැන සඳහන් කරයි. මම හිතන්නේ යරින්ගේ පිළිතුර මෙම ප්‍රශ්නයට පිළිතුර ලෙස පිළිගත යුතුය.
alwbtc

2
walwbtc: මෙම පිළිතුරට අලුත් දෙයක් ද තිබේ. උදාහරණයක් ලෙස "සුපිරි ()" ගැන සඳහන් කිරීම මා තවත් වැදගත් එකක් වෙත ගෙන ගියේය [මෙහි] ( stackoverflow.com/questions/576169/… ).
ViFI

34

සිට ඉතිහාසය Python ඉගෙන ගන්න දෙන ආකාරය :

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

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

නව විලාසිතාවේ පන්ති සහ පැරණි විලාසිතාවේ පන්ති අතර වෙනස කුමක්දැයි ඔබට දැන ගැනීමට නම්, නව විලාසිතාවේ පන්ති සෑම විටම objectපන්තියෙන් හෝ වෙනත් පන්තියකින් උරුම වී ඇත object:

class NewStyle(object):
    pass

තවත් උදාහරණයක්:

class AnotherExampleOfNewStyle(NewStyle):
    pass

පැරණි විලාසිතාවේ මූලික පන්තියක් මේ ආකාරයට පෙනේ:

class OldStyle():
    pass

පැරණි පන්තියේ ළමා පන්තියක් මේ වගේ ය:

class OldStyleSubclass(OldStyle):
    pass

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


8
මූල පංතිය ඇමතීම objectඑතරම් ව්‍යාකූල නොවන අතර ඇත්ත වශයෙන්ම එය තරමක් ප්‍රමිතියකි. ස්මාල්ටෝක් හි මූල පංතියක් නම් Objectකර ඇති අතර මූල මෙටැක්ලාස් නම් කර Classඇත. මන්ද? මන්ද, Dogබල්ලන් Objectසඳහා පන්තියක් මෙන්ම, වස්තූන් සඳහා පන්තියක් ද, Classපන්ති සඳහා පන්තියක් ද වේ. ජාවා, සී #, ඕබ්සීසී, රූබි සහ වෙනත් බොහෝ පංති පාදක ඕඕ භාෂාවන් අද භාවිතා කරන මූල පංතියක් Objectඇති පයිතන් පමණක් නොව නම ලෙස යම් වෙනස්කමක් භාවිතා කරයි .
abarnert

30

ඔව්, එය .තිහාසිකයි . එය නොමැතිව, එය පැරණි විලාසිතාවේ පන්තියක් නිර්මාණය කරයි.

ඔබ type()පරණ විලාසිතාවේ වස්තුවක් භාවිතා කරන්නේ නම් , ඔබට "නිදසුනක්" ලැබේ. නව විලාසිතාවේ වස්තුවක් මත ඔබට එහි පන්තිය ලැබේ.


එසේම, ඔබ type()පැරණි විලාසිතාවේ පන්තියක් භාවිතා කරන්නේ නම් , ඔබට "වර්ගය" වෙනුවට "classobj" ලැබේ.
ජොයෙල් සජ්‍රන්

7

පන්ති නිර්මාණය කිරීමේ ප්‍රකාශයේ වාක්‍ය ඛණ්ඩය:

class <ClassName>(superclass):
    #code follows

ඔබට විශේෂයෙන් උරුම කර ගැනීමට අවශ්‍ය වෙනත් සුපිරි පන්ති නොමැති විට, superclassසෑම විටම විය යුත්තේ objectපයිතන්හි සියලුම පන්තිවල මුලයි.

objectතාක්ෂණික වශයෙන් පයිතන් හි "නව විලාසිතාවේ" පන්ති වල මුල වේ. නමුත් අද දින නව විලාසිතාවේ පන්ති එකම පන්ති පන්තිය තරම්ම හොඳයි.

එහෙත්, ඔබ objectපන්ති නිර්මාණය කිරීමේදී වචනය පැහැදිලිවම භාවිතා නොකරන්නේ නම්, අනෙක් අය සඳහන් කළ පරිදි, පයිතන් 3.x ව්‍යංගයෙන් උරුම වන්නේobject . නමුත් මම අනුමාන කිරීම නිරපේක්ෂ (නිරයට) වඩා හොඳ යැයි සිතමි

යොමුව

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.