2012-06-06 22 views
8

Olası Çoğalt: Python Statik yöntemler, neden?


What is the difference between @staticmethod and @classmethod in Python?

Ben sınıflarında staticmethods ilgili birkaç soru var. Bir örnek vererek başlayacağım.

örnek:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

Çıkışlar:

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

örnek:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

Çıkışlar

Hello Ephexeve M, your age is 18 

Görünüşe göre, herhangi bir self.attribute'u bir staticmethods içinde arayamıyorum, ne zaman ve neden kullanmak gerektiğinden emin değilim. Aklımda, atfedilen bir sınıfı oluşturursanız, belki de bunları daha sonra kullanmak istersiniz ve tüm özniteliklerin kalıcılığının olmadığı bir statik yöntem bulunmaz. Bunu herkes anlatabilir mi? Python benim ilk programlama langungumdur, bu yüzden eğer Java'da aynıysa, bilmiyorum. Bunu staticmethod elde etmek çalıştığımız şey

+0

kapatmak için oy verme istemem ama bağladıysanız söz konusu cevapları oldukça iyidir. Not @ classmethod 'javas' statik 'benzer. @ staticmethod 'oldukça işe yaramaz. –

+0

Teşekkürler Josh, belki de düzgün aramadım, bağlantı için teşekkürler, şimdi kontrol edecek –

cevap

8

? Ne yaptığını bilmiyorsan, sorunun ne olduğunu çözmek için nasıl bekliyorsun?

Ya da sadece staticmethod ne yaptığını görmek için etrafında oynuyorsunuz? Bu durumda, rastgele bir şekilde uygulamak ve davranışından ne olduğunu anlamaya çalışmak yerine, ne yapılacağını anlatmak read the docs için daha verimli olacaktır. bir sınıftaki bir fonksiyonu tanımına @staticmethod uygulanması Her durumda

, bir "statik bir yöntem" hale getirir. “Statik” ne yazık ki programlamada en çok kafa karıştırıcı olan terimlerden biridir; Burada, yönteminin, nesnenin durumuna veya nesnesine bağlı olmadığı anlamına gelir. Bar sınıfında tanımlanmış bir foo statik yöntem varsa, bar.foo(...) ( bar sınıfının bir örneğidir, Bar sınıfının bir örneğidir), bar'un özniteliklerini içerdiğinden bağımsız olarak tam olarak aynı şeyi yapar. Hatta bir örneğim bile olmadığında onu doğrudan sınıftan Bar.foo(...) olarak söyleyebilirim!

Bu sadece statik yönteme örneği geçmeyen ile elde edilir, bu şekilde statik yöntemler bir self parametresi vardır.

Statik yöntemler nadiren gerekli, ama bazen uygundur. Bunlar, sınıfın dışında tanımlanmış basit işlevlerle aynıdır, ancak onları sınıfta koymak, onları sınıfla "ilişkilendirilmiş" olarak işaretler. Genellikle bunları sınıfla yakından ilişkili olan şeyleri hesaplamak veya yapmak için kullanırsınız, ancak aslında belirli bir nesne üzerinde işlem yapmazsınız.

İlgili konular