Özünüzün məqsədi nədir?

Python sözünün self nədir? Mən başa düşdüm ki, bu, bu sinifdən yaradılan xüsusi bir obyektə aiddir, lakin hər bir funksiyaya bir parametr kimi açıq şəkildə əlavə edilməlidir. Yəni, Ruby-də bunu edə bilərəm:

25 апр. set richzilla 25 apr. 2010-04-25 23:22 '10 at 11:22 pm 2010-04-25 23:22
@ 20 cavab

self. istifadə etmək lazımdır self. Python, sözdizim atributlarına istinad etmək üçün @ sintaksisini istifadə etmir. Python üsulları bu metodun aid olduğu nümunənin avtomatik olaraq ötürülməsinə qərar verməyə qərar verdi, lakin avtomatik olaraq qəbul edilmədi: metodun ilk parametri metodu ilə çağırılan nümunədir. Bu üsullar funksiyaları tamamilə eyni edir və sizdən əvvəl istifadə ediləcək əsl adı tərk edir ( self konvensiyaya baxmayaraq və insanlar başqa bir şey istifadə etdiyiniz zaman adətən qaşqabaq olacaq). başqa bir obyekt.

Python normal adları atributlardan fərqləndirmək üçün başqa bir şey edə bilər - Ruby kimi xüsusi sintaksis və ya C ++ və Java kimi bəyanatları tələb edə bilər, ya da bəlkə də daha fərqli bir şeydir, amma bu deyil. Python, bütün bunları açıq bir şəkildə ortaya qoyur və buna baxmayaraq ətrafdakı bütün yolları etmir, baxmayaraq ki, bunlar atributları edir. Buna görə də, bir nümunəyə bir atribut təyin etmək üçün, hansı formanı təyin etmək istədiyini və niyə self. ehtiyac duyduğunu bilmək lazımdır self. .

605
25 апр. Tomas Woutersə 25 Aprel cavab verin 2010-04-25 23:25 '10 at 23:25 2010-04-25 23:25

Sadə bir vektor sinifinə keçin:

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

Uzunluğu hesablayan bir üsula sahib olmaq istəyirik. Bir sinif içərisində təsvir etmək istədiyimiz kimi nə görünür?

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

Qlobal metod / funksiya kimi müəyyənləşdirmək lazımdırsa, bu nə kimi olmalıdır?

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

Beləliklə, bütün quruluş eyni qalır. Necə istifadə edə bilərəm? Vector length metodunu yazmadığımızı bir anda Vector , bunu edə bilərik:

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

Bu, ilk parametrenin length_global parametrinin length_global da self parametr kimi istifadə edilə biləcəyi üçün length_new . Bu, self ifadə etmədən mümkün olmazdı.


Həqiqi mənbəyə olan ehtiyacı başa düşmək üçün başqa bir üsul Python'un bəzi sintaktik şəkərləri qoşduğunu görməkdir. Əsasən xatırladığınız zaman, çağırış növü

 v_instance.length() 

daxili olaraq çevrildi

 Vector.length(v_instance) 

self harada görmək asandır. Əslində Pythonda nümunə üsulları yazmırsınız; nə yazdığınız ilk parametre kimi bir nümunə götürməli olan sinif üsullarıdır. Və beləliklə, bir nümunə parametrini dəqiq göstərməlisiniz.

387
28 апр. Cavab Debilski 28 apr verilir . 2010-04-28 03:03 '10 at 3:03 2010-04-28 03:03

Deyək, sizin kimi bir methodA ehtiva edən methodA Class sinfi var:

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

ObjectA bu sinifin bir nümunəsidir.

İndi ObjectA.methodA(arg1, arg2) çağırıldığında, python onu ObjectA.methodA(arg1, arg2) çevirir:

 ClassA.methodA(ObjectA, arg1, arg2) 

Dəyişən self obyektin özü ilə əlaqələndirir.

295
26 янв. Cavab 26 yanvarda Arjun Sreedharan tərəfindən verilir . 2014-01-26 20:31 '14 saat 20:31 'də 2014-01-26 20:31

Nesneler oluşturulduktan sonra, nesne özünü parametreye aktarılır.

2019

159
28 июня '15 в 8:47 2015-06-28 08:47 Cavab verilir sw123456 28 iyun 'da 8:47 2015-06-28 08:47

Bu nümunəni sevirəm:

 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: [] 
65
26 апр. Cavab 26 apr verildi . 2010-04-26 19:02 '10 at 19:02 2010-04-26 19:02

Siniflərdən istifadə etməyən kodu göstərəcəyəm:

 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' 

Dərslər hər zaman dövlətin bu vəziyyətindən keçməmək üçün bir yoldur (və başlatma, sinif kompozisiyası, nadir hallarda tələb olunan metaclasses və operatorları yenidən təyin etmək üçün xüsusi metodlara dəstək kimi digər gözəl şeylər).

İndi python sinifinin quraşdırılmış maşınını əsasən eyni şəkildə göstərmək üçün yuxarıda göstərilən kodu göstərin.

 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 ) 

[cavabımı yinelenen bir kapalı suçtan köçürdüm]

33
22 июня '11 в 3:27 2011-06-22 03:27 Cavab verilib ninjagecko 22 iyun 'da 3:27 2011-06-22 03:27

Artıq qeyd olunan bütün digər səbəblər kimi, bu, qaçırılan üsullara daha asan daxil olur; Class.some_method(inst) bilərsiniz.

Bunun faydalı olduğu bir nümunə:

 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
25 апр. Cavab Ponkadoodle 25 apr verilir . 2010-04-25 23:31 '10 at 11:31 pm 2010-04-25 23:31

Özünüz haqqında Python Sənədlərindən aşağıdakı alıntılar:

Modula-3-də olduğu kimi, obyektlərin üzvlərinə onun metodlarından [Python] istinad etməsi üçün heç bir qısaltmalar yoxdur: metodun funksiyası örtülü bir zəng ilə təmin edilən obyektin açıq bir ilk arqumenti ilə elan edilir.

Tez-tez bir üsula ilk mübahisə öz adlanır. Bu, bir konvensiyadan başqa bir şey deyil: "Mən" adı Python üçün tamamilə xüsusi bir məna daşımır. Bununla yanaşı, konvensiyaya hörmət etmədən, kodunuzu digər Python proqramçıları tərəfindən az oxunaqlı ola bilər və belə bir müqaviləyə əsaslanan bir sinif proqramı tərtib edilə biləcəyini də unutmayın.

Daha ətraflı məlumat üçün Python Documentation Class Tutorial-a baxın .

16
25 апр. Cavab Matthew Rankin tərəfindən verilir 25 Aprel. 2010-04-25 23:29 '10 at 11:29 2010-04-25 23:29

Onun istifadəsi this Java-da istifadə edilməsinə bənzəyir, yəni. mövcud obyektə istinad etmək.

11
30 авг. Gaurav Nishant tərəfindən verilmiş cavab 30 Avqust. 2012-08-30 19:37 '12 saat 19:37 'da 2012-08-30 19:37

Python Java-ya və ya C ++-dən fərqli obyekt yönümlü proqramlaşdırma üçün yaradılmış bir dil deyil.

Pythonda statik bir metod çağırdığınız zaman, sadəcə daxilində müntəzəm arqumentlərlə metodu yazırsınız.

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

Buna baxmayaraq, bir dəyişən etmək tələb edən obyekt metodu, bu halda Heyvan, bu vəziyyətdə özünü müdafiə etməlidir.

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

Öz metodu, sinif daxilində dəyişən bir sahəni təyin etmək üçün də istifadə olunur.

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

Bu halda, özünü bütün sinif üçün dəyişən heyvana aiddir. Xatırla: Əgər metodda dəyişən varsa, işləməyəcəyəm. Bu dəyişən yalnız sadəcə bu metod çalışırken mövcuddur. Sahələri (bütün sinifdəki dəyişənləri) müəyyən etmək üçün onların kənar sinif üsullarını təyin etməlisiniz.

Mən dediklərim haqqında bir sözü anlamırsan, onda Google'ın "Obyektə Yönəli Proqramlaşdırma." Bunu başa düşdükdə, hətta bu suala sual verməyəcəksiniz.

11
25 мая '15 в 19:04 2015-05-25 19:04 cavab ytpillai tərəfindən verilir May 25, '15 at 19:04 2015-05-25 19:04

Onun orada Python zen'i təqib etməsi, "örtülü olduğundan daha dəqiq". Bu, həqiqətən, sizin sinif obyektiniz üçün bir əlaqədir. Məsələn, Java və PHP-də bunu deyilir.

user_type_name sizin modelinizin bir sahəsidirsə, özünə self.user_type_name daxil self.user_type_name .

7
16 авг. Cavab verilir dan-klasson 16 aug. 2013-08-16 20:23 '13 at 20:23 2013-08-16 20:23

self obyektin özü üçün obyekt istinad edir, buna görə də eynidır. Python üsulları obyektin özü kontekstində deyil. Python self xüsusi obyekt modelləri və ya başqa bir şeylə məşğul olmaq üçün istifadə edilə bilər.

4
25 апр. Cavab Ming-Tang tərəfindən Aprel 25 verilir 2010-04-25 23:26 '10 at 11:26 PM 2010-04-25 23:26

Mən heç kimə Lua qaldırmıram. Lua da dəyişən "özünü" istifadə edir, ancaq onu atsın, ancaq istifadə edin. C ++ 'bu' ilə eynidır. Mən hər işdə "məni" elan etmək üçün heç bir səbəb görmürəm, amma lua və C ++ ilə istifadə edə bilərsiniz. Özünü qısaca tərifləyən bir dil üçün, özünü bəyan etmənizi tələb edən qəribə bir şeydir.

3
12 янв. İstifadəçi 441521 tərəfindən verilmiş cavab 12 yanvar 2016-01-12 21:10 '16 saat 9:10 'da 2016-01-12 21:10

Bunun səbəbi pythonun dizaynıdır, çünki alternativlər işləmək çətin deyil. Python, this (a-la Java / C ++) və ya açıq-aydın @ (a-la ruby) işləməyəcək kontekstdə üsulları və funksiyaları müəyyən etmək üçün nəzərdə tutulmuşdur. Python konvensiyaları ilə açıq bir yanaşma ilə nümunə götür:

 def fubar(x): self.x = x class C: frob = fubar 

İndi fubar funksiyası işləməyəcək, çünki self qlobal dəyişən ( frob kimi) hesab edir. Alternativ əvəz edilmiş qlobal sahə ilə üsulu icra etmək olar ( self obyekt olduğu).

Yumşaq bir yanaşma olacaq

 def fubar(x) myX = x class C: frob = fubar 

Bu, myX fubar (və frob ) bir yerli dəyişən kimi myX olunacaq deməkdir. Burada alternativlər zənglər arasında saxlanılan əvəz edilmiş lokal ərazilərlə üsulları icra etmək olar, lakin bu üsulun lokal dəyişənlərinin mümkünlüyünü aradan qaldıracaq.

Ancaq mövcud vəziyyət yaxşı işləyir:

  def fubar(self, x) self.x = x class C: frob = fubar 

Burada bir frob metodu olaraq frob , self parametr ilə çağırılan bir obyekt alır və fubar hələ bir obyekt ilə bir parametrə kimi çağırıla bilər və eyni şəkildə işləyir (bu, düşünürəm ki, C.frob ).

2
27 авг. Cavab skuking verilir 27 aug. 2015-08-27 10:31 '15 at 10:31 'da 2015-08-27 10:31

İlk növbədə, mən ümumi bir adıyam, onun yerində başqa bir şey (ardıcıllıqla) verə bilərsiniz.

Bu, obyektin özünə aiddir, buna görə də onu istifadə etdiyiniz zaman elan edirsiniz. Ad və .age - yaratmaq üçün hazırladığınız Tələbə obyektlərinin xüsusiyyətləri (not deyil, tələbə sinfi).

 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 

Kod burada

2
12 янв. Cavab harrypotter0 12 yanvar tərəfindən verilir 2018-01-12 07:45 '18 saat 07:45 'də 2018-01-12 07:45

Şübhəsiz ki, " self " anlamaq çətin deyil, çünki lazımi bir şeydir? Və ya niyə birbaşa qeyd edirsiniz? Bu, bu sualları axtarır olan bir çox istifadəçi üçün böyük bir sualdır və ya yoxsa onlar gələcəkdə piton öyrənməklə eyni suallara sahib olacaqlar. Mən bu iki blogu oxumaq üçün onlara məsləhət görürəm:

1: Self-Service istifadə

Xahiş edirik bu bir söz deyil.

Hər bir sinif üsulunun ilk arqumenti, init daxil olmaqla, həmişə sinifin mövcud nümunəsinə aiddir. Konvensiya ilə bu arqument həmişə özünü deyir. İn init metodunda yeni yaradılmış obyektə aiddir; digər sinif metodlarında, bu metodu çağırılan nümunəyə aiddir. Məsələn, aşağıdakı kod, yuxarıda göstərilən kodla eynidır.

2: Niyə biz bunu və niyə biz bunu Java kimi bir argüman olaraq xaric edə bilmərik və bunun yerine açar sözünü istifadə edə bilərik

Əlavə etmək istərdim başqa bir şey, self yazmadan bir sinif içərisində statik üsulları elan etməyə imkan verən isteğe bağlı self arqumentidir.

Kod nümunələri:

 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 : Yalnız Python 3.x-da işləyir.

Əvvəlki versiyalarda, @staticmethod dekorativini açıq şəkildə əlavə @staticmethod , əks halda self @staticmethod .

1
01 авг. Cavab Bugs Buggy 01 aug verilir. 2018-08-01 13:53 '18 at 13:53 2018-08-01 13:53

Aşağıdakı nümunəyə nəzər salın. Bu, self məqsədini açıq şəkildə izah edir 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 istifadə edir / nümunələri ayırmaq tələb olunur.

1
15 нояб. Cavab verilir kmario23 15 noyabr. 2014-11-15 10:54 '14 at 10:54 2014-11-15 10:54

__init__ üsulunda, özünü yeni yaradılmış obyektə aid edir; digər sinif metodlarında, bu metodu çağırılan nümunəyə aiddir.

özünü, bir ad olaraq, yalnız bir razılaşma , istədiyiniz şeyi zəng edin! lakin, məsələn, bir obyekti silmək üçün istifadə edərkən eyni adı istifadə etməlisiniz: __del__(var) , burada var __init__(var,[...])

Görünüşü böyütmək üçüncls ə cls . Bu yazı faydalı ola bilər.

1
26 янв. Cavab TheEnglishMe tərəfindən verilir 26 Yanvar 2014-01-26 21:11 '14 at 21:11 2014-01-26 21:11

"öz" yeni yaradılmış obyektə istinad etmək üçün istifadə olunur.

məsələn, bir standart sinifdə bir üsul elan edirsinizsə, avtomatik olaraq ilk arqument kimi bir nümunə alır.

Konvensiyaya görə, bu "məni" python.it-də yalnız güclü bir razılıq deyirik. Siz başqa bir adla zəng edə bilərsiniz.

Özünə daxil olmaq lazım olmayan bir üsula ehtiyacınız varsa, staticmethod istifadə edin:

 class TestClass(): @staticmethod def staticMethod(other_arg): print "This is a static method" def instanceMethod(self,other_arg): #This is instance method print "self is instance" ##If you want access to the class, but not to the instance, use classmethod: @classmethod def my_class_method(cls, other_arg): print "this is a class method" 
0
08 авг. Cavab Projesh Bhoumik 08 aug tərəfindən verilir . 2018-08-08 14:19 '18 at 2:19 pm 2018-08-08 14:19

Bu, sinfi instansiya obyektinə açıq istinad edir.

-3
25 апр. SilentGhost cavab 25 Apr. 2010-04-25 23:24 '10 at 23:24 2010-04-25 23:24

Etiketler haqqında digər suallar və ya bir sual