Python'da statik sınıf değişkenlerine veya yöntemlerine sahip olmak mümkün mü? Bunu yapmak için hangi sözdizimi gereklidir?
Sınıf tanımı içinde bildirilen, ancak bir yöntem içinde bildirilmeyen değişkenler sınıf veya statik değişkenlerdir:
>>> class MyClass:
... i = 3
...
>>> MyClass.i
3
millerdev](https://stackoverflow.com/questions/68645/static-class-variables-in-python#answer-69067)'in belirttiği gibi, bu sınıf düzeyinde bir i
değişkeni oluşturur, ancak bu herhangi bir örnek düzeyinde i
değişkeninden farklıdır, bu nedenle
>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)
Bu C++ ve Java'dan farklıdır, ancak statik bir üyeye bir örneğe referans kullanılarak erişilemeyen C#'tan çok farklı değildir.
Python öğreticisinin sınıflar ve sınıf nesneleri konusunda söylediklerine bakın]1.
Steve Johnson](#68656) statik metotlar ile ilgili olarak daha önce cevap vermiştir, ayrıca "Built-in Functions" in the Python Library Reference altında da belgelenmiştir.
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@beidy staticmethod yerine classmethodları öneriyor, çünkü yöntem ilk argüman olarak sınıf türünü alıyor, ancak bu yaklaşımın staticmethod'a göre avantajları konusunda hala biraz bulanıkım. Eğer siz de öyleyseniz, o zaman muhtemelen önemli değildir.
Şahsen ben statik bir yönteme ihtiyaç duyduğumda bir classmethod kullanırdım. Bunun temel nedeni, sınıfı bir argüman olarak almamdır.
class myObj(object):
def myMethod(cls)
...
myMethod = classmethod(myMethod)
veya bir dekoratör kullanın
class myObj(object):
@classmethod
def myMethod(cls)
Statik özellikler için... Biraz python tanımına bakmanın zamanı geldi... değişken her zaman değişebilir. Değişebilir ve değişmez olmak üzere iki türü vardır. Ayrıca, sınıf nitelikleri ve örnek nitelikleri vardır. java & c++ anlamında statik nitelikler gibi bir şey yok
Eğer sınıfla hiçbir ilişkisi yoksa, neden statik metodu pitonik anlamda kullanalım ki! Yerinizde olsam ya classmethod kullanırdım ya da metodu sınıftan bağımsız olarak tanımlardım.
Python'da statik yöntemler classmethodolarak adlandırılır. Aşağıdaki koda bir göz atın
class MyClass:
def myInstanceMethod(self):
print 'output from an instance method'
@classmethod
def myStaticMethod(cls):
print 'output from a static method'
>>> MyClass.myInstanceMethod()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method myInstanceMethod() must be called [...]
>>> MyClass.myStaticMethod()
output from a static method
myInstanceMethod yöntemini çağırdığımızda bir hata aldığımıza dikkat edin. Bunun nedeni, yöntemin bu sınıfın bir örneği üzerinde çağrılmasını gerektirmesidir. myStaticMethod yöntemi, decorator @classmethod_ kullanılarak bir sınıf yöntemi olarak ayarlanır.
Sadece eğlence olsun diye, sınıfın bir örneğini ileterek sınıf üzerinde myInstanceMethod çağırabiliriz:
>>> MyClass.myInstanceMethod(MyClass())
bir örnek yöntemden çıktı