Soru Python'da statik bir kurucu veya statik başlatıcı var mı?


Python'da statik bir kurucu gibi bir şey var mı? 

Python'da statik bir kurucuyu nasıl uygularım?

İşte benim kodum ... __init__ App olarak adlandırdığımda, ateş etmiyor. __init__ statik bir kurucu veya statik başlatıcı değildir.

App.EmailQueue.DoSomething()

Bunu, her seferinde Uygulama sınıfını örnekleyen şöyle demeliyim:

App().EmailQueue.DoSomething()

İşte dersim:

class App:
    def __init__(self):
        self._mailQueue = EmailQueue()

    @property
    def EmailQueue(self):
        return self._mailQueue

Çağrı ile sorun __init__ Her seferinde Uygulama nesnesi yeniden oluşturulur. "Gerçek" Uygulama sınıfım epey uzun.


29
2017-09-13 02:11


Menşei


Neden bu kodu dersi tanımladıktan sonra koymuyorsun? Yoksa tembel başlatma mı istiyorsun? - SLaks


Cevaplar:


İpucu: referans veren herhangi bir şey self sınıfın bir örneğini gerektirecektir. Bunu böyle yapabilirsin:

class App:
    email_queue = EmailQueue()

App.email_queue.DoSomething()

Ama hadi, bu çok fazla tüy gibi görünüyor. SLaks'la birlikteyim, sadece sınıfın dışında başlatıyorum. Alternatif olarak, singleton kalıbı.


15
2017-09-13 02:17





Öncelikle her zaman belirgin olmayan statik ve dinamik diller arasında temel bir fark vardır.

Statik bir dilde, sınıf derleme zamanında tanımlanır ve program çalışmadan önce her şey güzel ve betona ayarlanır.

Dinamik bir dilde, sınıf aslında çalışma zamanında tanımlanır. Tercüman tüm bu sınıfları ve def ifadelerini yürütürken ve çalıştırmaya başladığında, statik bir kurucu eşdeğeri çalıştırılır. Sınıf tanımları o noktada yürütülür.

Sınıf gövdesinin herhangi bir yerine herhangi bir sayıda ifade koyabilirsiniz ve onlar aslında statik bir kurucu. İsterseniz hepsini alamadığınız bir işleve yerleştirebilirsiniz. self Bir parametre olarak, ve sınıfın sonunda bu işlevi çağırın.


19
2017-09-13 02:59



Gerçekten denedin mi placing them all in a function that doesn't take self and at the end of the class call that function? Bu, kulağa geldiği gibi düz değil, çünkü bu fonksiyon çalıştırıldığında sınıf henüz oluşturulmadı. - Ethan Furman


Uygulamanızı başlatmanız, ardından bunun yerine kullanmanız gerekir:

myApp = App()
myApp.EmailQueue.DoSomething()

2
2017-09-13 03:40



İyi bir nokta. OP, her seferinde "her zaman" ortaya çıktığı gerçeğini savundu. - Tom Russell


Burada, sınıf defından sonra ve herhangi bir sınıf fonksiyonundan önce kod bölgesi hakkında bir açıklama yapan konuyla ilgili bir başka ifade var. Bir kod koşulu yanı sıra bir kodlama bölgesi içine eklenmiş, böylece çeşitli editörler saklamak istediğiniz durumda bu kod gövdesini katlayabilirler.

class MyClass :

    myStaticVar1 = {}
    myStaticVar2 = []

    #region STATICINIT
    if not myStaticVar1 :
       # implement arbitrary initialization logic here
       # with any helper variables you don't want cluttering up the class
       localVarDontWantInClassScope = [1,2,3]

       myStaticVar1[0] = localVarDontWantInClassScope[0]
       myStaticVar1[1] = localVarDontWantInClassScope[2]

       myStaticVar2.append("abc")

       # local var cleanup
       del localVarDontWantInClassScope
    #endregion

    def f1(self, i) :
        print( "{} {}".format( i , MyClass.myStaticVar1[i] ) )

0
2018-05-03 20:47