it-swarm.dev

Bir sınıf yönteminden `` dönüş kendini '' amacı

Açık kaynaklı bir projede böyle bir şeyle karşılaştım. Örnek niteliklerini değiştiren yöntemler, örneğe bir başvuru döndürür. Bu yapının amacı nedir?

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return self
46
nate c

Zincirlemeye izin vermek.

Örneğin:

var Car = function () {
    return {
        gas : 0,
        miles : 0,
        drive : function (d) {
            this.miles += d;
            this.gas -= d;
            return this;
        },
        fill : function (g) {
            this.gas += g;
            return this;
        },
    };
}

Şimdi diyebilirsiniz:

var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;
66
Josh K

@Lie Ryan ve @Frank Shearar'ın belirttiği gibi, buna "akıcı arayüz" denir, ancak bu model çok uzun zamandır var.

Bu modelin tartışmalı kısmı, OO'da değişebilir duruma sahip olmanızdır, bu nedenle bir geçersiz yöntem, this - bir tür zımni dönüş değerine sahiptir - yani, güncellenmiş duruma sahip nesne bir tür dönüş değeri .

Dolayısıyla, OO değişebilir duruma sahip bir dilde, bu ikisi aşağı yukarı eşdeğerdir:

a.doA()
a.doB()
a.doC()

...aksine

a.doA().doB().doC()

Bu yüzden geçmişte insanların akıcı arayüzlere direndiğini duydum çünkü ilk formu seviyorlar. "Akıcı arayüz" için duyduğum başka bir isim de "tren kazası";)

Yine de "az ya da çok eşdeğer" diyorum, çünkü akıcı arayüzler kırışıklık yaratıyor. "Geri dönmek" zorunda değiller. Onlar "yeni dönebilir". Bu, OO'da değişmez nesnelere ulaşmanın bir yoludur.

Böylece A sınıfı olabilir (sözde kod)

function doA():
    return new A(value + 1)

function doB():
    return new A(value * 2)

function doC():
    return new A(sqrt(value))

Şimdi, her yöntem yepyeni bir nesne döndürerek ilk nesneyi değiştirmeden bırakır. Bu, kodunuzda çok fazla değişiklik yapmadan değişmez nesnelere girmenin bir yoludur.

10
Rob

Çoğu dil 'dönüş kendini' deyiminin farkındadır ve bir satırda kullanılmazsa yoksay. Ancak, Python'da işlevlerin varsayılan olarak None döndürmesi dikkat çekicidir.

CS okulundayken eğitmenim işlevler, prosedürler, rutinler ve yöntemler arasındaki fark hakkında büyük bir anlaşma yaptı; El krampları ile ilgili birçok soru, mekanik kalemlerin tüm bunlar hakkında elimde ısınmasıyla ortaya çıktı.

Söylemek yeterli, kendini döndürmek kesin OO zanaat sınıfı yöntemleri için yol, ama Python çoklu dönüş değerleri, tuples, listeler, nesneler, ilkellere izin verir veya Hiçbiri.

Zincirleme, koydukları gibi, sadece son operasyonun cevabını bir sonrakine ve Python) bu tür bir şeyi optimize edebilir. (Çok güçlü!)

Bu yüzden Python) her yöntem veya fonksiyonun bir şeyler döndürmesi o kadar önemli değildir, bu yüzden varsayılan Yok'tur.

Bir programdaki her eylemin başarısını, başarısızlığını veya geri çağırma bağlamına veya nesnesine geri dönmesi gerektiğini, ancak burada DOD ADA Gereksinimleri'nden bahsetmediğini düşünen bir okul vardır. Bir yöntemden geri bildirim almanız gerekiyorsa devam edin veya etmeyin, ancak bu konuda tutarlı olmaya çalışın.

Bir yöntem başarısız olursa, başarı veya başarısızlık döndürmeli veya işlenecek bir istisna ortaya koymalıdır.

Bir uyarı, dönüş öz deyimini kullanırsanız, Python tüm yöntemlerinizi değişkenlere atamanıza izin verir ve gerçekten elde ettiğinizde bir veri sonucu veya bir liste aldığınızı düşünebilirsiniz. nesne.

Tür kısıtlayıcı diller bunu yapmaya çalıştığınızda bağırır ve bağırır ve kırılır, ancak yorumlanan diller (Python, Lua, LISP) çok daha dinamiktir.

8
Chris Reid

Smalltalk'ta, açıkça bir şey döndürmeyen her yöntemin örtük bir "dönüş benliği" vardır.

Çünkü (a) her yöntemin bir şey döndürmesi, bilgisayar modelini daha homojen hale getirir ve (b) yöntemlerin kendi kendine dönmesini sağlamak çok faydalıdır. Josh K güzel bir örnek veriyor.

4
Frank Shearar

Bir nesneyi döndürmenin artıları (return self)

  • Misal:

    print(foo.modify1().modify2())
    
    # instaed of
    foo.modify1()
    foo.modify2()
    print(foo)
    
  • Programlama topluluğunda daha popüler bir stil (sanırım).

Bir nesneyi mutasyona uğratan profesyoneller (_ return self)

  • return 'ı başka amaçlarla kullanabilme.
  • Guido van Rossum bu tarzın onaylanması (Tartışmasına katılmıyorum).
  • Daha popüler tarzı Python topluluk (sanırım).
  • Varsayılan (daha az kaynak kodu).
2
xged