SORU
25 EYLÜL 2008, PERŞEMBE


@Staticmethod ve @Python classmethod arasındaki fark nedir?

Bir fonksiyon @staticmethod @classmethod süslenmiş süslenmiş arasındaki fark nedir?

CEVAP
3 Kasım 2009, Salı


Belki örnek kodu biraz yardımcı olacaktır: foo, class_foo static_foo çağrı imzalar arasında fark:

class A(object):
    def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)

    @classmethod
    def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)

    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)"%x    

a=A()

Aşağıda bir nesne örneği bir yöntem çağrıları her zamanki gibi. Nesne örneği, a, örtülü olarak ilk bağımsız değişken olarak geçirilir.

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

Classmethodsnesne örneğinin sınıfı örtülü olarak self yerine, ilk argüman olarak aktarılır.

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

Ayrıca class_foo sınıfını kullanarak arayabilirsiniz. Sana bir şey olarak tanımlarsanız, aslında, bir classmethod yerine bir sınıf örnek sınıfı çağırmak niyetinde çünkü muhtemelen. A.foo(1) eğer data kaldırdı olurdu, ama A.class_foo(1) gayet güzel çalışıyor:

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

İnsanlar sınıf yöntemleri için bulduk kullanın inheritable alternative constructors oluşturmaktır.


Staticmethodsne self (nesne örneği) ne cls (sınıfı) örtülü olarak ilk bağımsız değişken olarak geçirilir. Onlar bir örneği veya sınıf onları arayabilir dışında normal işlevlerini davranır gibi:

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

Staticmethods sınıf için bir sınıf ile bazı mantıksal bağlantısı olan grup fonksiyonları için kullanılır.


foo a.foo Ara fonksiyonu alamadım, sadece bir fonksiyonudur, "kısmen" örneği a fonksiyonu ilk argüman olarak bağlı. nesne ile işlev sürümü uygulanan bir foo a.foo sadece 1 değişken beklerken 2 argümanlar bekliyor.

a foo bağlıdır. Bu terim ile kastedilen budur "" aşağıda: . bağlı

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

a.class_foo, a class_foo yerine sınıfa bağlı değildir A 37* *bağlıdır.

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

Bir yöntem, a.static_foo sadece olsa bile, burada, bir staticmethod döner. iyi argüman bağlı 'ole işlevi. static_foo bekliyor 1 argüman, ve a.static_foo 1 argüman çok bekler.

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DragsterMC Gaming

    DragsterMC G

    30 HAZİRAN 2013
  • eyes4beautee

    eyes4beautee

    17 HAZİRAN 2011
  • psidot

    psidot

    2 Kasım 2006