1) self
Yöntem imzalarında neden açık parametre olarak gereklidir?
Çünkü yöntemler foo.bar(baz)
işlevlidir ve sadece sözdizimsel şekerdir bar(foo, baz)
. Sınıflar sadece bazı değerlerin fonksiyon olduğu sözlüklerdir. (Yapıcılar da sadece işlevlerdir, bu yüzden Python'a ihtiyaç duymazlar new
) Python'un nesnelerin daha basit bileşenlerden oluşturulduğunu açıkça ifade ettiğini söyleyebilirsiniz. Bu "açık, örtük olmaktan daha iyidir" felsefesine uygundur.
Buna karşılık, Java'da nesneler gerçekten büyülüdür ve dildeki daha basit bileşenlere indirgenemez. Java'da (en azından Java 8'e kadar) bir işlev her zaman bir nesnenin sahip olduğu bir yöntemdir ve bu sahiplik dilin statik doğası nedeniyle değiştirilemez. Bu nedenle neye this
atıfta bulunduğu konusunda bir belirsizlik yoktur , bu nedenle dolaylı olarak tanımlanması mantıklıdır.
JavaScript, this
Java gibi örtük olan ancak işlevlerin Python'daki nesnelerden ayrı olarak var olabileceği bir dile örnektir . Bu , işlevler farklı bağlamlarda aktarıldığında ve çağrıldığında neye işaret ettiği konusunda çok karışıklığa yol açar this
. Çoğu içgüdüsel olarak düşünmek this
, işlevin bazı içsel özelliklerine atıfta bulunurken, aslında tamamen işlevin çağrılmasıyla belirlenir. this
Python gibi açık bir parametre olarak sahip olmak bu çok daha az kafa karıştırıcı olur inanıyorum .
Açık self
parametrenin diğer bazı faydaları :
Dekoratörler sadece diğer işlevleri saran işlevlerdir. Yöntemler sadece işlevler olduğundan, dekoratörler yöntemlerde iyi çalışır. Bir tür örtülü benlik olsaydı, dekoratörler yöntemlerde şeffaf bir şekilde çalışmazlardı.
Sınıf yöntemleri ve statik yöntemler bir örnek parametresi almaz. Sınıf yöntemleri bir sınıfı ilk argüman olarak alır (genellikle denir cls
). Açık self
veya cls
parametreler, neler olup bittiğini ve yöntemde nelere erişebildiğinizi çok daha net hale getirir.
2) Örnek değişkenleri neden daima "ile nitelendirilmelidir self.
? "
Java'da üye değişkenlere " this.
" öneki eklemeniz gerekmez , ancak Python " self.
" da her zaman gereklidir. Bunun nedeni, Python'un değişkenleri bildirmek için açık bir sözdizimine sahip olmamasıdır, bu nedenle x = 7
yeni bir yerel değişken bildirmesi veya bir üye değişkene ataması gerekip gerekmediğini anlamanın bir yolu yoktur . Belirtmek self.
bu belirsizliği çözer.