'ස්වයං' යන වචනයේ අරමුණ කුමක්ද?


1147

selfපයිතන්හි වචනයේ අරමුණ කුමක්ද? එය පන්තියෙන් නිර්මාණය කරන ලද නිශ්චිත වස්තුවක් බව මට වැටහී ඇත, නමුත් එය පරාමිතියක් ලෙස සෑම ශ්‍රිතයක් සඳහාම පැහැදිලිවම එකතු කළ යුත්තේ මන්දැයි මට නොපෙනේ. නිදර්ශනය කිරීම සඳහා, රූබි භාෂාවෙන් මට මෙය කළ හැකිය:

class myClass
    def myFunc(name)
        @name = name
    end
end

මට තේරෙන, ඉතා පහසුවෙන්. කෙසේ වෙතත් පයිතන්හි මා ඇතුළත් කළ යුත්තේ self:

class myClass:
    def myFunc(self, name):
        self.name = name

මේ හරහා කිසිවෙකුට මා සමඟ කතා කළ හැකිද? එය මගේ (පිළිගත් සීමිත) අත්දැකීම් තුලින් මා හමු වූ දෙයක් නොවේ.


113
ගයිඩෝ වැන් රොසුම්
unutbu

14
ක්‍රම නිර්වචන සහ ඇමතුම් වලදී "ස්වයං" පැහැදිලිව භාවිතා කළ යුත්තේ ඇයිද යන්නද බලන්න: docs.python.org/faq/…
unutbu

37
"මට තේරෙන, ඉතා පහසුවෙන්" --- තරමක් ආත්මීය, ඔබ සිතන්නේ නැද්ද? @nameවඩා බුද්ධිමත් වන්නේ කුමක් ද self.name? දෙවැන්න, IMO, වඩා බුද්ධිමත් ය.
සැන්ටා

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

9
මෙම නිර්මාණ තේරීම "පැහැදිලිව ඇඟවීමට වඩා හොඳය" යැයි මම නොසිතමි. @fooහා self.fooකිසිදු සමානව පැහැදිලි වේ ගම්ය යෝජනාව සිදු කිරීමට අවශ්ය (C ++ උදා, උදාහරණයක් සාමාජිකයන් "නිසැකයෙන්ම" "පැහැදිලිව ම" නාමඅවකාශයන්හි භාවිතා නොකර ප්රවේශ විය හැක). එකම වෙනස වන්නේ රූබි විසින් නව අර්ථකථනයක් (@) හඳුන්වා දෙන අතර පයිතන් එසේ නොකරයි. නව අර්ථකථනයක් වටිනවාද නැද්ද යන්න වාචිකත්වයේ ප්‍රමාණයෙන් වැළකී සිටීම තනිකරම ආත්මීය ය. බොහෝ නූතන භාෂාවන් මෙහි සංකල්පයක් හඳුන්වා දීමට තෝරාගෙන ඇති බව සැලකිල්ලට ගත යුතුය (උදා: php's $ this, JS's this).
ජිං

Answers:


720

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

සාමාන්‍ය නම් වලින් ගුණාංග වෙන්කර හඳුනා ගැනීම සඳහා පයිතන්ට වෙනත් දෙයක් කළ හැකිය - රූබි වැනි විශේෂ වාක්‍ය ඛණ්ඩයක් හෝ සී ++ සහ ජාවා ඩෝ වැනි ප්‍රකාශ අවශ්‍ය වේ, හෝ ඊට වඩා වෙනස් දෙයක් - නමුත් එය එසේ නොවීය. පයිතන් සියල්ලම පැහැදිලිව ප්‍රකාශ කිරීම, කුමක් දැයි පැහැදිලි කිරීම සහ එය සම්පූර්ණයෙන්ම සෑම තැනකම සිදු නොකලද එය නිදසුනක් ලෙස එය කරයි. නිදර්ශන ගුණාංගයකට පැවරීම සඳහා කුමන අවස්ථාව පැවරිය යුතු දැයි දැන ගැනීමට අවශ්‍ය වන්නේ එබැවිනි self..


23
E ජෝර්ජ්: clsපංති වස්තුවට මිස නිදර්ශන වස්තුවට නොවේ
නිහ ile හොස්ට්

17
Ile සයිලන්ට් හොස්ට්: ඇත්ත වශයෙන්ම, පළමු පරාමිතියේ නම ඔබට අවශ්‍ය ඕනෑම දෙයක් වේ. පන්ති ක්‍රම මත, සම්මුතිය භාවිතා කිරීම වන clsඅතර selfසාම්ප්‍රදායිකව උදාහරණ ක්‍රම සඳහා භාවිතා කරයි. මට අවශ්‍ය නම්, මට selfපන්ති clsක්‍රම සහ උදාහරණ ක්‍රම භාවිතා කළ හැකිය. මටත් භාවිතා කළ හැකි bobඅතර fnordමා කැමති නම්.
SingleNegationElimination

67
thisඒ වෙනුවට ප්‍රජාව තෝරා නොගැනීම මට සිත්ගන්නා කරුණකි self. කරන්නේ selfපැරණි වැඩසටහන් භාෂා මම දැන නැහැ සමහර ඉතිහාසය?
ජූල්ස් GM

24
Ul ජුලියස් selfපැමිණියේ මොඩියුලා -3 සම්මුතීන්ගෙන්, මෙම තේරීම පිළිබඳ වැඩි විස්තර සඳහා මෙම පිළිතුර බලන්න . (වියාචනය: එහි පතල).
බකුරියූ

9
Ul ජුලියස් self( ස්මාල්ටෝක් , 1980) යතුරුපදය පෙර this(සී ++ වෙතින්). බලන්න: stackoverflow.com/questions/1079983/…
වෙස් ටර්නර්

434

ඔබට පන්තියක් ClassAඇති බව කියමු methodA.

def methodA(self, arg1, arg2):
    # do something

හා ObjectAමෙම පන්තියේ උදාහරණයක් වේ.

දැන් ObjectA.methodA(arg1, arg2)හැඳින්වූ විට , පයිතන් අභ්‍යන්තරව එය ඔබ වෙනුවෙන් පරිවර්තනය කරයි:

ClassA.methodA(ObjectA, arg1, arg2)

මෙම selfවිචල්ය වස්තුව ම සඳහන් කරයි.


97
මම අනෙක් සියලුම පිළිතුරු කියවා තේරුම් ගත්තා, මම මෙය කියවා බැලුවෙමි.
සෙත්

3
මේක මට ඇණ ගැහුවා!
බර්නාඩ් 'බීටා බර්ලින්' පරා

2
රූබි මෙන් එම ධෛර්යය ඇතුළත තබා නොගන්නේ මන්ද?
සීස් ටිමර්මන්

නමුත් __init __ (self) ක්‍රමයේදී එය ස්වයංව පිළිගනී, පසුව වස්තුව නිර්මාණය නොකර පවා එය තමාටම යොමු වන්නේ කෙසේද?
සෞරව්

බරපතල ලෙස, මෙය ඩෙබිල්ස්කිගේ ආදර්ශයට වඩා හොඳය, මන්ද එය ඕනෑවට වඩා සංකීර්ණ නොවන අතර මිනිසුන් දෛශික ගැන හුරුපුරුදු නොවිය හැකිය.
NoName

426

අපි සරල දෛශික පන්තියක් ගනිමු:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

දිග ගණනය කරන ක්‍රමයක් අපට අවශ්‍යය. පංතිය තුළ අපට එය අර්ථ දැක්වීමට අවශ්‍ය නම් එය කෙබඳු වනු ඇත්ද?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

අප එය ගෝලීය ක්‍රමයක් / ශ්‍රිතයක් ලෙස අර්ථ දැක්වීමේදී එය කෙබඳු විය යුතුද?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

එබැවින් සමස්ත ව්‍යුහයම එලෙසම පවතී. මට මෙය භාවිතා කළ හැක්කේ කෙසේද? lengthඅපගේ Vectorපංතිය සඳහා ක්‍රමවේදයක් ලියා නොමැති බව අපි මොහොතකට උපකල්පනය කළහොත් අපට මෙය කළ හැකිය:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

නිසා පළමු පරාමිතිය මෙම ක්රියා length_global, ලෙස නැවත භාවිතා කළ හැකි selfතුළ පරාමිතිය length_new. පැහැදිලි කිරීමකින් තොරව මෙය කළ නොහැකි වනු ඇත self.


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

v_instance.length()

අභ්‍යන්තරව පරිවර්තනය වේ

Vector.length(v_instance)

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


4
Vector.length_new = length_global ... මම ඇත්ත වශයෙන්ම මගේ පන්ති ප්‍රකාශනවල මේ වගේ සින්ටැක්ස් භාවිතා කිරීමට පටන් ගතිමි. මට වෙනත් පංතියකින් සමහර ක්‍රම පමණක් උරුම කර ගැනීමට අවශ්‍ය වූ විට, මම පැහැදිලිවම එම ක්‍රමවේදයන් වෙත යොමු කරමි.
ජෙයූං කිම්

2
පයිතන්ගේ “නිදර්ශන ක්‍රමය” යනු හුදෙක් බහු ගුණාංග ඇසුරුම් කිරීම සඳහා නිදර්ශන වස්තුවක් සමඟ ස්ථිතික ගෝලීය ක්‍රමවේදයන්ගේ (ජාවා හෝ සී ++ වැනි) සින්ටැක්ටික් සීනි යැයි පැවසීම සාධාරණද? --- හොඳයි, මෙය බහු සත්‍යතාවයෙන් අඩක් සත්‍ය වන බැවින්, “මෙය” (ජාවාහි මෙන්) හෝ “ස්වයං” හි වඩා වැදගත් අරමුණ වන්නේ ක්‍රමවේදයන් නිවැරදිව ක්‍රියාත්මක කිරීමයි. පයිතන්ට මෙය තිබේ. එබැවින් myobj.someMethod () ඇමතීම පයිතන්හි TheClassOfMyObj.someMethod (myobj) ට සමාන වේ. "TheClassOfMyObj" ස්වයංක්‍රීයව පයිතන් විසින් "ස්වයං" වලින් හදුනා ගන්නා බව සලකන්න, එසේ නොමැතිනම් ඔබට එය සොයා ගැනීමට සිදුවේ.
ටෙඩි ටෙඩි

3
ඉන්ෆැක්ට්, නිදර්ශන ක්‍රම යනු පන්ති ක්‍රම පමණක් නොව, ක්‍රම යනු පංතිවල සාමාජිකයන් වන කාර්යයන් පමණක් Vector.length_new = length_globalපෙන්වයි.
රුස්ඩබ්

1
"මෙය ක්‍රියාත්මක වන්නේ දිග_ ග්ලෝබල් හි පළමු පරාමිතිය දිග_ අළුත් ස්වයං පරාමිතිය ලෙස නැවත භාවිතා කළ හැකි බැවිනි. පැහැදිලි ස්වයංවාරණයකින් තොරව මෙය කළ නොහැකි වනු ඇත." - එය එකම ආකාරයකින් ක්‍රියා කරයි. එය ව්‍යංග ස්වයං සඳහා නැවත භාවිතා කරනු ඇත ... දෙවන උදාහරණය චක්‍රලේඛ තර්කනයකි - ඔබට පැහැදිලිවම ස්වයංව ස්ථානගත කළ යුතුය, මන්ද පයිතන්ට පැහැදිලි ස්වයං අවශ්‍ය වේ.
කරෝලි හෝර්වාත්

1
A කැරොලි හෝර්වාත්: අභ්‍යන්තරව නිර්වචනය කරන ලද ක්‍රමවේදයන්ට පැහැදිලි ස්වයං අවශ්‍යතාවයක් නොමැති නමුත් බාහිරව නිර්වචනය කරන ලද ක්‍රමවේදයන් සහිත ආකෘතියක් සහිත භාෂාවක් තිබිය හැකි බව සහතිකයි. නමුත් අවස්ථා දෙකේදීම පැහැදිලි ස්වයං අවශ්‍යතාවයක යම් අනුකූලතාවක් ඇති බව මම කියමි, එමඟින් එය මේ ආකාරයෙන් කිරීමට නීත්‍යානුකූල හේතුවක් වේ. වෙනත් භාෂා විවිධ ප්‍රවේශයන් තෝරා ගත හැකිය.
ඩෙබිල්ස්කි

217

වස්තූන් ක්ෂණිකව සිදු කළ විට, වස්තුව ස්වයං පරාමිතිය තුළට යවනු ලැබේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මේ නිසා, වස්තුවේ දත්ත වස්තුවට බැඳී ඇත. පහත දැක්වෙන්නේ එක් එක් වස්තුවේ දත්ත කුමක් දැයි දෘශ්‍යමාන කිරීමට ඔබ කැමති ආකාරය පිළිබඳ උදාහරණයකි. 'ස්වයං' වස්තු නාමයෙන් ප්‍රතිස්ථාපනය කරන්නේ කෙසේදැයි බලන්න. පහත දැක්වෙන උදාහරණ රූප සටහන මුළුමනින්ම නිවැරදි යැයි මම නොකියමි, නමුත් එය ස්වයං භාවිතය දෘශ්‍යමාන කිරීමේ අරමුණක් ඉටු කරයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

වස්තුව ස්වයං පරාමිතිය තුළට සම්ප්‍රේෂණය වන අතර එමඟින් වස්තුවට තමන්ගේ දත්ත රඳවා තබා ගත හැකිය.

මෙය සම්පුර්ණයෙන්ම නිවැරදි නොවිය හැකි වුවද, මෙවැනි වස්තුවක් ක්ෂණිකව ක්‍රියාත්මක කිරීමේ ක්‍රියාවලිය ගැන සිතන්න: වස්තුවක් සෑදූ විට එය පන්තිය තමන්ගේම දත්ත සහ ක්‍රම සඳහා අච්චුවක් ලෙස භාවිතා කරයි. ස්වයං පරාමිතිය තුළට තමන්ගේම නමක් නොතබා, පන්තියේ ගුණාංග සහ ක්‍රම සාමාන්‍ය අච්චුවක් ලෙස පවතිනු ඇති අතර එය වස්තුවට (අයත්) යොමු නොකෙරේ. එබැවින් වස්තුවේ නම ස්වයං පරාමිතිය තුළට යැවීමෙන් අදහස් වන්නේ එක් පන්තියකින් වස්තු 100 ක් ක්ෂණිකව ලබා ගත හොත්, ඒ සියල්ලටම ඔවුන්ගේ දත්ත සහ ක්‍රමවේදයන් පිළිබඳව සොයා බැලිය හැකි බවයි.

පහත උපමාව බලන්න:

රූප විස්තරය මෙහි ඇතුළත් කරන්න


ඒයි මේ විසින් උදාහරණයක් බොබ් ගේ ගුණාංග වෙත ප්රවේශ වෙන විට "bob.name ()", ඇත්ත වශයෙන්ම ඔබ බොබ් accesing () self.name. සිට 'කතා කිරීමට ඒ නිසා , init ' නේද?
udarH3

3
ඉහත අදහස් දැක්වීමේදී ඔබ bob.name () ලියන විට, ඔබ අදහස් කරන්නේ බොබ්ට නම () නමින් ක්‍රමයක් ඇති බවයි. කෙසේ වෙතත් මෙම උදාහරණයේ එවැනි ක්‍රමයක් නොමැත. 'bob.name' (වරහන් නොමැති) ආරම්භක (ඉදිකිරීම්කරු) ක්‍රමයෙන් නම නමින් හැඳින්වෙන ලක්ෂණයට කෙලින්ම ප්‍රවේශ වේ. බොබ්ගේ කථන ක්‍රමය හැඳින්වූ විට එය නාම ලක්ෂණයට ප්‍රවේශ වී මුද්‍රණ ප්‍රකාශයකින් ආපසු ලබා දෙන ක්‍රමයයි. මෙය උපකාරී වේ යැයි සිතමි.
sw123456

3
නැත, ඔබට self.name හි අගය ලැබෙනු ඇත, එය බොබ් වස්තුව සඳහා ඇත්ත වශයෙන්ම bob.name වේ, මන්ද එම වස්තුව නිර්මාණය වූ විට එය ස්වයං පරාමිතිය තුළට සම්ප්‍රේෂණය වේ (ක්ෂණිකව). නැවතත්, මෙය උපකාරී වේ යැයි බලාපොරොත්තු වෙමු. ප්‍රධාන තනතුර තිබේ නම් එය ඉහළ නැංවීමට නිදහස් වන්න.
sw123456

2
ක්ෂණිකව නම ස්වයං නාමයට පවරා ඇත. වස්තුවක් නිර්මාණය කිරීමෙන් පසු, වස්තුවට අයත් සියලුම විචල්‍යයන් 'ස්වයං' සමඟ උපසර්ගගත වේ. පංතියෙන් නිර්මාණය වූ විට ස්වයං වස්තුව වස්තුවේ නම සමඟ ප්‍රතිස්ථාපනය වන බව මතක තබා ගන්න.
sw123456

5
ඔබ දේවල් පැහැදිලි කරන ආකාරය මෙයයි! නියම වැඩක් :)
පෙන්ටා

81

මම මෙම උදාහරණයට කැමතියි:

class A: 
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: [5]

class A: 
    def __init__(self): 
        self.foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: []

18
එබැවින් ස්වයං නොමැතිව vars යනු ජාවා
ටෙඩි ටෙඩි

5
ටෙඩි ටෙඩි, ඔබ සම්පූර්ණයෙන්ම නිවැරදි නැත. හැසිරීම (ස්ථිතික හෝ ස්ථිතික නොවන) රඳා පවතින්නේ පමණක් selfනොව විචල්‍ය වර්ගය මත ය. ලැයිස්තුව වෙනුවට සරල නිඛිලයකින් පළමු උදාහරණය කිරීමට උත්සාහ කරන්න. ප්රති result ලය බෙහෙවින් වෙනස් වනු ඇත.
කොන්ස්ටන්ටින්

2
ඇත්ත වශයෙන්ම, මේ සමඟ ඇති මගේ ප්‍රශ්නය වන්නේ a.fooපළමු උදාහරණයේ දී පැවසීමට වඩා ඔබට ඉඩ දෙන්නේ මන්ද A.fooයන්නයි. පැහැදිලිවම fooපන්තියට අයත් වේ ...
රේඩන් රොස්බරෝ

බොහෝ භාෂාවලින් වස්තුවේ අවස්ථා වලින් ඔබට ස්ථිතික සාමාජිකයන් ඇමතිය හැකිය. එය පුදුමයට කරුණක් වන්නේ ඇයි?
පාර්ත්

2
@RadonRosborough පළමු උදාහරණය නිසා, aසහ bසඳහා දෙකම ලේබල් (හෝ සූචක) වේ A()(පන්ති). පන්ති ක්‍රමය a.fooසඳහන් කරයි A().foo. දෙවන උදාහරණය තුළ, නමුත්, aක සැඳහුම බවට පත් උදාහරණයක් වන A(), මෙන් b. දැන් ඒවා පන්ති වස්තුව වෙනුවට නිදසුන් වන අතර, ස්වයං මඟින් fooක්‍රමයට ක්‍රියාත්මක වීමට ඉඩ ලබා දේ .
LegendaryDude

40

පංති භාවිතා නොකරන කේත සමඟ මම නිරූපණය කරමි :

def state_init(state):
    state['field'] = 'init'

def state_add(state, x):
    state['field'] += x

def state_mult(state, x):
    state['field'] *= x

def state_getField(state):
    return state['field']

myself = {}
state_init(myself)
state_add(myself, 'added')
state_mult(myself, 2)

print( state_getField(myself) )
#--> 'initaddedinitadded'

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

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

class State(object):
    def __init__(self):
        self.field = 'init'
    def add(self, x):
        self.field += x
    def mult(self, x):
        self.field *= x

s = State()
s.add('added')    # self is implicitly passed in
s.mult(2)         # self is implicitly passed in
print( s.field )

[මගේ පිළිතුර අනුපිටපත් සංවෘත ප්‍රශ්නයෙන් සංක්‍රමණය විය]


1
මම කැමතියි පයිතන් හසුරුවන්නන්ට මෙන්ම රූබිටද සීනි ආලේප කරන්න.
සීස් ටිමර්මන්

20

පහත දැක්වෙන උපුටා ගැනීම් ස්වයං පිළිබඳ පයිතන් ප්‍රලේඛනයෙන් වේ :

මොඩියුලා -3 හි මෙන්, වස්තුවේ සාමාජිකයන් එහි ක්‍රම වලින් යොමු කිරීම සඳහා [පයිතන්හි] කෙටිමං නොමැත: ක්‍රමයේ ක්‍රියාකාරිත්වය ප්‍රකාශයට පත් කරනු ලබන්නේ වස්තුව නියෝජනය කරන පැහැදිලි පළමු තර්කයෙනි, එය ඇමතුමෙන් ව්‍යංගයෙන් සපයනු ලැබේ.

බොහෝ විට, ක්‍රමයක පළමු තර්කය ස්වයං ලෙස හැඳින්වේ. මෙය සම්මුතියකට වඩා වැඩි දෙයක් නොවේ: ස්වයං යන නමට පයිතන්ට විශේෂ අර්ථයක් නැත. කෙසේ වෙතත්, සම්මුතිය අනුගමනය නොකිරීමෙන් ඔබේ කේතය වෙනත් පයිතන් ක්‍රමලේඛකයන්ට කියවිය නොහැකි බව සලකන්න. එවැනි සම්මුතියක් මත රඳා පවතින පන්ති බ්‍රව්සර් වැඩසටහනක් ලිවිය හැකි යැයි සිතිය හැකිය.

වැඩි විස්තර සඳහා, පන්ති පිළිබඳ පයිතන් ප්‍රලේඛන නිබන්ධනය බලන්න .


20

දැනටමත් සඳහන් කර ඇති අනෙකුත් සියලුම හේතු මෙන්ම, අභිබවා ගිය ක්‍රම වෙත පහසුවෙන් ප්‍රවේශ වීමට එය ඉඩ දෙයි; ඔබට ඇමතිය හැකිය Class.some_method(inst).

එය ප්‍රයෝජනවත් තැනකට උදාහරණයක්:

class C1(object):
    def __init__(self):
         print "C1 init"

class C2(C1):
    def __init__(self): #overrides C1.__init__
        print "C2 init"
        C1.__init__(self) #but we still want C1 to init the class too
>>> C2()
"C2 init"
"C1 init"

17

එහි භාවිතය thisජාවා හි යතුරු පද භාවිතා කිරීමට සමාන වේ , එනම් වත්මන් වස්තුවට යොමු දැක්වීමක්.


2
class myClass: def myFunc (මෙය, නම): this.name = name
LEMUEL ADANE

16

පයිතන් යනු ජාවා හෝ සී ++ මෙන් නොව වස්තු දිශානත වැඩසටහන්කරණය සඳහා සාදන ලද භාෂාවක් නොවේ.

පයිතන්හි ස්ථිතික ක්‍රමයක් අමතන විට යමෙක් එය තුළ සාමාන්‍ය තර්ක සහිත ක්‍රමයක් ලියයි.

class Animal():
    def staticMethod():
        print "This is a static method"

කෙසේ වෙතත්, වස්තුවක් වන ඔබට විචල්‍යයක් කිරීමට අවශ්‍ය වන සතෙකු වන මෙම අවස්ථාවේදී ස්වයං තර්කය අවශ්‍ය වේ

class Animal():
    def objectMethod(self):
        print "This is an object method which needs an instance of a class"

පංතිය තුළ විචල්ය ක්ෂේත්රයක් යොමු කිරීම සඳහා ස්වයං ක්රමය භාවිතා කරයි.

class Animal():
    #animalName made in constructor
    def Animal(self):
        self.animalName = "";


    def getAnimalName(self):
        return self.animalName

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

මා පවසන දෙයින් එක වචනයක්වත් ඔබට තේරෙන්නේ නැත්නම්, ගූගල් "Object Oriented Programming". ඔබ මෙය තේරුම් ගත් පසු, ඔබට එම ප්‍රශ්නය ඇසීමට පවා අවශ්‍ය නොවනු ඇත :).


නිසා අතර වෙනස වන +1 staticMethod()හා objectMethod(self). පළමුවැන්නාට ආයාචනා කිරීම සඳහා එය එකතු කිරීමට මම කැමතියි Animal.staticMethod(), objectMethod()උදාහරණයක් අවශ්‍ය වන අතර:a = Animal(); a.objectMethod()
ලැරික්ස් ඩෙසිඩුවා

ඔබ කියන දේ 100% සත්‍ය නොවේ. එය සමුළුවක් පමණි. සාදන ලද වස්තුවකින් ඔබට තවමත් ස්ථිතික ක්‍රමය ඇමතිය හැකිය. ඔබ ස්වයං ප්‍රකාශයක් නොකළ නිසා ඔබට කිසිදු පන්ති සාමාජිකයෙකු භාවිතා කිරීමට නොහැකි වනු ඇත. ස්ථිතික නොවන ලෙස හැඳින්වීමට මට Animal.objectMethod (animalObj) අමතන්න. මූලික වශයෙන් මෙයින් අදහස් කරන්නේ ස්ථිතික ක්‍රමයක් යනු සාමාජික විචල්‍යයන් භාවිතා නොකරන ක්‍රමයක් පමණක් බවයි. ස්වයං ප්‍රකාශ කිරීමේ අවශ්‍යතාවයක් නොතිබිය යුතුය. එය මෝඩ භාෂා අවශ්‍යතාවයක් යැයි මම සිතමි. Lua සහ C ++ වැනි භාෂා ඔබට තිරය පිටුපස obj විචල්‍යයන් ලබා දෙයි.
user441521

ඔබ නිෂ් less ල සත්ව නාම නූල ප්‍රකාශයක් සහ බිඳ වැටෙන සත්ව නාම ක්‍රමයක් සිදු කළේය.
සීස් ටිමර්මන්

3
tytpillai අදාල නොවේ. ව්‍යාකූල සහ වැරදි කේතයක් පිළිතුරක් ලෙස ඉදිරිපත් නොකළ යුතුය.
සීස් ටිමර්මන්

1
def getAnimalNameඔබ නැවත පැමිණීමට උත්සාහ කරන නූලට නොගැලපෙන selfඅතර, එය පන්තියේ උදාහරණයට මිස එහි ඇතුළත කිසිදු ක්ෂේත්‍රයක් නොවේ.
සීස් ටිමර්මන්

10

පයිතන් සෙන් අනුගමනය කිරීම එහි ඇත “පැහැදිලිව ඇඟවීමට වඩා හොඳය”. එය ඇත්ත වශයෙන්ම ඔබේ පන්ති වස්තුවට යොමු කිරීමකි. ජාවා සහ පීඑච්පී වල, උදාහරණයක් ලෙස, එය හැඳින්වේ this.

user_type_nameඔබේ ආකෘතියේ ක්ෂේත්‍රයක් නම් ඔබ එයට පිවිසිය හැකිය self.user_type_name.


10

පළමුවෙන්ම, ස්වයං යනු සම්ප්‍රදායික නමකි, ඔබට වෙනත් ඕනෑම දෙයක් (සුහදව) ඒ වෙනුවට තැබිය හැකිය.

එය වස්තුවටම යොමු දක්වයි, එබැවින් ඔබ එය භාවිතා කරන විට .name සහ .age යනු ඔබ නිර්මාණය කිරීමට යන ශිෂ්‍ය වස්තූන්ගේ ගුණාංග බව සලකන්න (සටහන, ශිෂ්‍ය පන්තියේ නොවේ).

class Student:
    #called each time you create a new Student instance
    def __init__(self,name,age): #special method to initialize
        self.name=name
        self.age=age

    def __str__(self): #special method called for example when you use print
        return "Student %s is %s years old" %(self.name,self.age)

    def call(self, msg): #silly example for custom method
        return ("Hey, %s! "+msg) %self.name

#initializing two instances of the student class
bob=Student("Bob",20)
alice=Student("Alice",19)

#using them
print bob.name
print bob.age
print alice #this one only works if you define the __str__ method
print alice.call("Come here!") #notice you don't put a value for self

#you can modify attributes, like when alice ages
alice.age=20
print alice

කේතය මෙහි ඇත


9

selfවස්තුවකටම වස්තු යොමු කිරීමකි, එබැවින් ඒවා සමාන වේ. පයිතන් ක්‍රම හැඳින්වෙන්නේ වස්තුවේ සන්දර්භය තුළ නොවේ. selfඅභිරුචි වස්තු ආකෘති හෝ වෙනත් දෙයක් සමඟ කටයුතු කිරීමට පයිතන් භාවිතා කළ හැකිය.


8

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

1: ස්වයං භාවිතය පැහැදිලි කිරීම

එය මූල පදයක් නොවන බව සලකන්න.

Init ඇතුළුව සෑම පන්ති ක්‍රමයකම පළමු තර්කය සෑම විටම පන්තියේ වර්තමාන අවස්ථාව වෙත යොමු කිරීමකි. සම්මුතිය අනුව, මෙම තර්කය සැමවිටම ස්වයං ලෙස නම් කර ඇත. ආරම්භක ක්‍රමයේදී ස්වයං යන්නෙන් අදහස් කරන්නේ අලුතින් සාදන ලද වස්තුවයි; වෙනත් පංති ක්‍රම වලදී, එය යොමු කරනුයේ ක්‍රමවේදය හැඳින්වූ අවස්ථාවයි. උදාහරණයක් ලෙස පහත කේතය ඉහත කේතයට සමාන වේ.

2: අපට එය මේ ආකාරයෙන් ඇත්තේ ඇයි සහ අපට එය ජාවා වැනි තර්කයක් ලෙස තුරන් කළ නොහැක්කේ ඇයි?

මම එකතු කිරීමට කැමති තවත් දෙයක් නම්, විකල්ප selfතර්කයක් මඟින් ලිවීමකින් තොරව පන්තියක් තුළ ස්ථිතික ක්‍රම ප්‍රකාශ කිරීමට මට ඉඩ ලබා දේ self.

කේත උදාහරණ:

class MyClass():
    def staticMethod():
        print "This is a static method"

    def objectMethod(self):
        print "This is an object method which needs an instance of a class, and that is what self refers to"

PS : මෙය ක්‍රියාත්මක වන්නේ පයිතන් 3.x හි පමණි.

පෙර සංස්කරණ වලදී, ඔබ පැහැදිලිවම @staticmethodසැරසිලි කරුවෙකු එකතු කළ යුතුය , එසේ නොමැතිනම් selfතර්කය අනිවාර්ය වේ.


7

මට පුදුමයි කවුරුත් ලුවා හදා වඩා ගත්තේ නැහැ. ලුආ ද 'ස්වයං' විචල්‍යය භාවිතා කරයි, කෙසේ වෙතත් එය මඟ හැරිය හැකි නමුත් තවමත් භාවිතා වේ. C ++ 'මෙය' සමඟ ද එසේමය. සෑම කාර්යයකදීම 'ස්වයං' ප්‍රකාශ කිරීමට කිසිදු හේතුවක් මා දකින්නේ නැත, නමුත් ඔබට තවමත් ලුවා සහ සී ++ සමඟ එය භාවිතා කළ හැකිය. කෙටියෙන් කියා ආඩම්බර වන භාෂාවක් සඳහා ස්වයං විචල්‍යය ප්‍රකාශ කිරීම අවශ්‍ය වේ.


6

පහත දැක්වෙන උදාහරණය දෙස බලන්න, එහි අරමුණ පැහැදිලිව පැහැදිලි කරයි self

class Restaurant(object):  
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
           print("branch opened")

#create instance1
>>> x = Restaurant()
>>> x.bankrupt
False

#create instance2
>>> y = Restaurant()
>>> y.bankrupt = True   
>>> y.bankrupt
True

>>> x.bankrupt
False  

self අවස්ථා අතර වෙනස හඳුනා ගැනීමට භාවිතා කරයි / අවශ්‍ය වේ.

මූලාශ්‍රය: පයිතන් හි ස්වයං විචල්‍යය පැහැදිලි කර ඇත - පයිතොන්ටිප්ස්


1
ඔව්, මම හිතන්නේ අපි භාවිතා කරන්නේ ඇයි කියා අපි දන්නවා, නමුත් ප්‍රශ්නය වන්නේ භාෂාව ඔබව එය පැහැදිලිව ප්‍රකාශ කරන්නේ ඇයි යන්නයි. වෙනත් බොහෝ භාෂාවන්ට මෙය අවශ්‍ය නොවන අතර කෙටියෙන් කියා ආඩම්බර වන භාෂාවක් නම්, ඔබ සිතන්නේ ඔවුන් තිරය පිටුපස ඇති විචල්‍යය ලුවා හෝ සී ++ (මෙය) වැනි භාවිතා කිරීමට ඔබට ලබා දෙනු ඇති බවයි.
user441521

3
@ kmario23 ඔබේ ප්‍රතිචාරය මෙතැනින් විය: pythontips.com/2013/08/07/the-self-variable-in-python-explained කරුණාකර පිළිතුරු ඔබේම ලෙස පළ කිරීමේදී මුල් කතුවරුන් පිළිගන්න.
geekidharsh

5

එයට හේතුව පයිතන් නිර්මාණය කර ඇති විට විකල්පයන් කිසිසේත්ම ක්‍රියා නොකරනු ඇත. පයිතන් නිර්මාණය කර ඇත්තේ ව්‍යංග this(a-la Java / C ++) හෝ පැහැදිලි @(a-la ruby) යන දෙකම ක්‍රියා නොකරන සන්දර්භයක් තුළ ක්‍රම හෝ කාර්යයන් අර්ථ දැක්වීමට ඉඩ සලසමිනි. පයිතන් සම්මුතීන් සමඟ පැහැදිලි ප්‍රවේශය සමඟ උදාහරණයක් ගනිමු:

def fubar(x):
    self.x = x

class C:
    frob = fubar

එය ගෝලීය විචල්‍යයක් fubarයැයි උපකල්පනය කරන බැවින් දැන් ශ්‍රිතය ක්‍රියා නොකරනු ඇත self( frobඑසේම). විකල්පය වනුයේ ප්‍රතිස්ථාපිත ගෝලීය විෂය පථයකින් ( selfවස්තුව කොහේද ) ක්‍රමවේදය ක්‍රියාත්මක කිරීමයි.

ව්‍යංග ප්‍රවේශය වනු ඇත

def fubar(x)
    myX = x

class C:
    frob = fubar

මෙයින් අදහස් වන්නේ myXඑය දේශීය විචල්‍යයක් ලෙස fubar(සහ frobමෙන්ම) අර්ථ දැක්විය හැකි බවයි. මෙහි ඇති විකල්පය වනුයේ ඇමතුම් අතර රඳවා තබා ඇති ප්‍රතිස්ථාපිත දේශීය විෂය පථයක් සහිත ක්‍රමවේදයන් ක්‍රියාත්මක කිරීමයි, නමුත් එමඟින් දේශීය විචල්‍යයන්ගේ ක්‍රමවේදය ඉවත් කරයි.

කෙසේ වෙතත් වර්තමාන තත්වය හොඳින් ක්‍රියාත්මක වේ:

 def fubar(self, x)
     self.x = x

 class C:
     frob = fubar

මෙහි ක්රමයක් ලෙස ඉල්ලා සිටි විට frobමත එය හරහා අමතන්නේ වස්තුව ලැබෙනු ඇත selfපරාමිතිය, සහ fubarඑම තවමත් පරාමිතිය හා වැඩ කටයුතු ලෙස වස්තුවක් එක්ක යනුවෙන් නම් කළ හැකිය (එය වේ සමාන C.frobමම හිතන්නේ).


3

තුළ __init__ක්රමය, ස්වයං අලුතින් නිර්මාණය වස්තුව හඳුන්වන්නේ; වෙනත් පංති ක්‍රම වලදී, එය යොමු කරනුයේ ක්‍රමවේදය හැඳින්වූ අවස්ථාවයි.

ස්වයං, නමක් ලෙස, සම්මුතියක් පමණි , ඔබට අවශ්‍ය පරිදි එය අමතන්න! නමුත් එය භාවිතා කරන විට, උදාහරණයක් ලෙස වස්තුව මකා දැමීමට, ඔබ එකම නමක් භාවිතා කළ යුතුය : __del__(var), varභාවිතා කළ ස්ථානය__init__(var,[...])

ඔබ දෙස ගත යුතු clsඇති, ඉතා විශාල ඡන්ද චිත්රයක් . මෙම ලිපිය ප්‍රයෝජනවත් විය හැකිය.


3

ස්වයං ක්‍රියා කරන්නේ වත්මන් වස්තු නම හෝ පන්තියේ උදාහරණය ලෙස ය.

# Self explanation.


 class classname(object):

    def __init__(self,name):

        self.name=name
        # Self is acting as a replacement of object name.
        #self.name=object1.name

   def display(self):
      print("Name of the person is :",self.name)
      print("object name:",object1.name)


 object1=classname("Bucky")
 object2=classname("ford")

 object1.display()
 object2.display()

###### Output 
Name of the person is : Bucky
object name: Bucky
Name of the person is : ford
object name: Bucky

1

self නොවැළැක්විය හැකිය.

යන්තම් ඇති විය ප්රශ්නය යුතු selfගම්ය හෝ පැහැදිලි විය. රැඳී සිටිය යුතුGuido van Rossum යැයි කියමින් මෙම ප්‍රශ්නය selfවිසඳීය .

ඉතින් කොහෙද selfජීවත් වෙන්නේ?

අපි ක්‍රියාකාරී වැඩසටහන් වලට ඇලී සිටියහොත් අපට අවශ්‍ය නොවනු selfඇත. අපි පයිතන් ඕඕපීයට ඇතුළු වූ පසු selfඑහි අපට හමු වේ.

මෙන්න class Cක්‍රමය සමඟ සාමාන්‍ය භාවිත අවස්ථාවm1

class C:
    def m1(self, arg):
        print(self, ' inside')
        pass

ci =C()
print(ci, ' outside')
ci.m1(None)
print(hex(id(ci))) # hex memory address

මෙම වැඩසටහන ප්‍රතිදානය කරයි:

<__main__.C object at 0x000002B9D79C6CC0>  outside
<__main__.C object at 0x000002B9D79C6CC0>  inside
0x2b9d79c6cc0

එබැවින් selfපන්තියේ උදාහරණයේ මතක ලිපිනය රඳවා තබා ගනී. මෙහි අරමුණ වනුයේ නිදර්ශන ක්‍රමself සඳහා යොමු කිරීම සහ එම සඳහනට අපට පැහැදිලි ප්‍රවේශයක් තිබීමයි.


පන්ති ක්‍රම විවිධ ආකාර තුනක් ඇති බව සලකන්න:

  • ස්ථිතික ක්‍රම (කියවන්න: කාර්යයන්),
  • පන්ති ක්‍රම,
  • නිදර්ශන ක්‍රම (සඳහන් කර ඇත).

0

සිට ලේඛන ,

ක්‍රම පිළිබඳ විශේෂත්වය නම් නිදර්ශන වස්තුව ශ්‍රිතයේ පළමු තර්කය ලෙස සම්මත කිරීමයි. අපගේ උදාහරණයේ දී, ඇමතුම x.f()හරියටම සමාන වේ MyClass.f(x). පොදුවේ ගත් කල, n තර්ක ලැයිස්තුවක් සහිත ක්‍රමයක් ඇමතීම, පළමු තර්කයට පෙර ක්‍රමයේ නිදර්ශන වස්තුව ඇතුළත් කිරීමෙන් නිර්මාණය කරන ලද තර්ක ලැයිස්තුවක් සමඟ අනුරූප ශ්‍රිතය ඇමතීමට සමාන වේ.

මෙයට පෙර අදාළ ස්නිපටය,

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

x = MyClass()


0

මම අවම වශයෙන් පයිතන් සඳහා කියමි, ස්වයං පරාමිතිය ස්ථානගත කරන්නෙකු ලෙස සිතිය හැකිය. මෙය දෙස බලන්න:

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

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

මෙය පයිතන්ට උපකාරී වේ යැයි සිතමු!


-1

එය පන්ති නිදර්ශන වස්තුව පිළිබඳ පැහැදිලි සඳහනකි.


21
මම හිතන්නේ නැහැ මෙය රිච්සිලාට හේතුව තේරුම් ගැනීමට උපකාරී වේ.
ජෝර්ජ් ෂෝලි

1
Ile සයිලන්ට් හොස්ට්: ඔබ එය ඇණ ගැසුවා. මට පුදුමයි. මම එය නිවැරදිව තේරුම් ගන්නේ නම්: මම අර්ථ දැක්වූ පන්තියේ නිදසුනක් ලෙස වස්තුවක් නිර්මාණය කරන අතර ස්වයං පරාමිතිය එම වස්තුවට යොමු වේ ද? ස්වයං තේරීම පංතියට ම ගම්‍ය වන බව මට වැටහී ඇති නමුත් ඔබ ඔබේ පිළිතුර තව ටිකක් පැහැදිලි කළහොත් එය ඉතා හොඳ වේ.
dkrynicki
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.