2008-09-17 23 views
2

Static class variables in PythonPythonWin'in python etkileşimli kabuğu kurucuları iki kez mi çağırıyor?

Yanıtlarken PythonWin PyWin32'nin 209.2 yorumlayıcısının iki kez değerlendirdiği görülüyor mu? piton tercüman doğru şeyi yaparken aşağıdaki gibi

PythonWin 2.5 (r25:51908, Mar 9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32. 
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information. 
>>> class X: 
...  l = [] 
...  def __init__(self): 
...   self.__class__.l.append(1) 
...   
>>> X().l 
[1, 1] 
>>> 

C:\>python 
ActivePython 2.5.0.0 (ActiveState Software Inc.) based on 
Python 2.5 (r25:51908, Mar 9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class X: 
... l = [] 
... def __init__(self): 
...  self.__class__.l.append(1) 
... 
>>> X().l 
[1] 
>>> 
+0

@Gregory, bu PyWin için bir SO sorusundan daha çok bir hata raporu gibi görünüyor. –

cevap

3

Benim tahminim olduğunu. PythonWin editörü, bir nesne için otomatik tamamlama sunar, yani myobject. yazdığınızda, tüm kullanılabilir yöntem adlarının küçük bir açılır penceresini sunar. Bu yüzden, X(). yazarken, arka planda X örneğini oluştururken ve dir yapıp nesnenin niteliklerini bulmak için benzer şekilde yaptığımı düşünüyorum.

Bu nedenle, kurucu yalnızca her bir nesne için çalıştırılıyor, ancak size anlatılmadan arka planda sessizce nesneler oluşturması için etkileşime girmenizi sağlıyor.

1

İki küçük ek nokta.

İlk olarak, self.__class__.l.append(1) gerçekten duyarlı değildir.

Sadece self.l.append(1) deyin. Python, örneği referans için sınıfa aramadan önce arar.

Daha da önemlisi, sınıf düzeyi değişkenler nadiren kullanışlıdır. Sınıf düzeyi sabitler bazen mantıklıdır, ancak o zaman bile haklı çıkarmaları zordur.

C++ ve Java'da, sınıf düzeyi ('static') değişkenleri kullanışlı görünüyor, ancak çok fazla şey yapmayın. N00bz'e öğretmek zor - çoğu zaman minutia üzerinde çok fazla sınıf zamanı harcıyorlar - ve çok pratik değiller. Oluşturulan bir X'in tüm örneklerini öğrenmek isterseniz, sınıf değişkenlerine dayanmayan bir XFactory sınıfı oluşturmak daha iyi olabilir.

Sınıf düzeyi değişken anomaliler yok. Ve X'leri X'lerin koleksiyonuyla karıştırmaz. Uzun vadede, bir sınıf hem bir şey hem de bazı şeylerin bir topluluğu olduğunda kafa karıştırıcı buluyorum.

Simpler, Kompleks'ten daha iyidir.

+0

Gönderinime bakarsanız, ekli olan statik soruya cevap veriyorum. Bu yüzden, örnek değişkenini değil, sınıf değişkenini özellikle değiştirmek istiyorum. Yazdığım kod, sınıf değişkenlerine açıkça erişmek için "en temiz" yoldur. – Gregory

2

Dave Webb doğrudur ve bir baskı deyimi ekleyerek bunu görebilirsiniz:

>>> class X: 
...  l = [] 
...  def __init__(self): 
...    print 'inited' 
...    self.__class__.l.append(1) 
...    

Sonra en kısa sürede X(). yılında dönemini yazarken o inited önce size tamamlama açılır pencere sunmayı yazdırır.