@Staticmethod ve @Python classmethod arasındaki fark nedir?
Bir fonksiyon @staticmethod
@classmethod
süslenmiş süslenmiş arasındaki fark nedir?
CEVAP
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>
Eski stil ve yeni stil Python sınıflar...
Python 2'de range ve xrange fonksiyonl...
yerleşik fonksiyon aç python: mod, bir...
bir İfade ve Python ile Deyim arasında...
Python ve ipython arasındaki fark nedi...