2011-01-09 43 views
8

'da varsayılan olmayan bir değişken olarak kullanmak, sınıf içinde özel bir sınıf değişkeni tutmanın ve varsayılan değer olarak varsayılan değer olarak kullanmaya devam etmenin bir yolu (bu değerin önüne önce, bu değerin dışına çıkmadan) sınıf)?Sınıf değişkenini python

örnek:

class a: 
    def __init__(self): 
     self.__variable = 6 
    def b(self, value = self.__variable): 
     print value 
+5

Python yapar ** değil used.' edilecek yol açmadan b geçirilebilir. Hiç de. Kullandığınız çifte alt çizgi **, değişkeni özel yapmaz, sadece isim çatışmasından kaçınmak için adlandırma yapar. Neden zorunda olduğunuzu bilmiyorsanız çift alt çizgi kullanmayın. ;) –

+0

Harika bir soru! (Şey, sahip olduğum büyük bir problemi çözdü, o yüzden ...) – nchpmn

cevap

14

Sorunu overthinking ediyoruz:

class a: 

    def __init__(self): 
     self.__variable = 6 

    def b(self, value=None): 
     if value is None: 
      value = self.__variable 
     print value 
+0

vay. Başarısız oldum. Teşekkürler! – calccrypto

4
  1. self.__variable bir örnek değişkeni değil, bir sınıf değişkendir.
  2. varsayılan argümanlar fonksiyon yöntem tanımı anda değerlendirilir olduğundan, varsayılan argüman olarak bir örnek değişkeni kullanamazsınız - en azından doğrudan (her zamanki hile, None varsaymak ve fonksiyon vücuda if arg is None: arg = real_default ekleyerek çalışır).
  3. Önde gelen çift alt çizgi "özel" anlamına gelmez, "ad mangling ve sorun sorma" anlamına gelir. Tam olarak ne demek istediğimi bilmiyorsanız, bu "özelliği" hiç kullanmamalısınız. Kullanım amacı, değil, özel üyeleridir - bunun için bir alt çizgi kullanın.
+0

Peki, ** ** kullanım amacı nedir? –

+1

@Karl: Alt sınıflarda ad çakışmasını önleme. Bakınız örn. http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers veya http://docs.python.org/tutorial/classes.html?highlight=mangling#private-variables (üçüncü paragraf)). – delnan

+0

Sadece 1 alt çizgi – calccrypto

3

None izin verilen bağımsız değişkenler aralığında olmasını istiyorsanız, kodunuzdaki başka herhangi bir amaçla kullanılmayan özel bir ileti değeri oluşturabileceğiniz buna eklemeye değer. Bunu yapmadan value, None hiçbir zaman b'dan iade edilemez.

UseDefault = object() 

# Python 3? Otherwise, you should inherit from object unless you explicitly 
# know otherwise. 
class a:  
    def __init__(self): 
     self._variable = 6 

    def b(self, value=UseDefault): 
     if value is UseDefault: 
      value = self._variable 
     print value 

Şimdi None ** özel sınıf değişkenleri bulunan varsayılan

İlgili konular