SORU
26 ŞUBAT 2009, PERŞEMBE


Neden't Python statik değişkenler var?

questions asking how to simulate static variables in python var.

Ayrıca, web üzerinde bir çok farklı çözümler statik değişkenleri oluşturmak için bulabilirsiniz. (Gerçi ben henüz böyle bir şey görmedim.)

Neden Python yöntemleri statik değişkenleri desteklemiyor mu? Bu unpythonic kabul edilir ya da bir şey Python sözdizimi ile ilgisi var mı?

Düzenleme:

Özellikle sordumnedentasarım kararı ve statik değişkenler simüle etmek için açıklama kaçınmak istediğim için herhangi bir kod örneği sağlanan değil.

CEVAP
27 ŞUBAT 2009, Cuma


Gerçekten bir jeneratör kullanarak olmalıdır zaman gerçekten bir sınıf kullanarak olmalıdır zaman. bu ihmal statik değişkenler sadece iki durumda yararlı arkasındaki fikir:

Eğer bir fonksiyon için durum bilgisi bilgi eklemek istiyorsan, ihtiyacın olan bir sınıftır. Basit basit bir sınıf, belki de, ama yine de sınıfı:

def foo(bar):
    static my_bar # doesn't work

    if not my_bar:
        my_bar = bar

    do_stuff(my_bar)

foo(bar)
foo()

# -- becomes ->

class Foo(object):
    def __init__(self, bar):
        self.bar = bar

    def __call__(self):
        do_stuff(self.bar)

foo = Foo(bar)
foo()
foo()

Eğer işlevin davranışı deniyor her zaman değiştirmek istiyorsan, ihtiyacın olan bir jeneratör

def foo(bar):
    static my_bar # doesn't work

    if not my_bar:
        my_bar = bar

    my_bar = my_bar * 3 % 5

    return my_bar

foo(bar)
foo()

# -- becomes ->

def foogen(bar):
    my_bar = bar

    while True:
        my_bar = my_bar * 3 % 5
        yield my_bar

foo = foogen(bar)
foo.next()
foo.next()

Tabii ki, statik değişkenlerküçük görevler için büyük yapılar güçlük uğraşmak istemiyorum hızlı-ve-kirli senaryo için faydalı. Ama yok, gerçekten global — ama kludgy görünebilir, ama bu küçük bir sorun, bir komut daha fazla bir şey gerekmez:

def foo():
    global bar
    do_stuff(bar)

foo()
foo()

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Muse

    Muse

    28 EYLÜL 2006
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011