2011-06-25 38 views
22

Python'da sınıf kapsamı olan bir global değişken tanımlamanın uygun yolu nedir?Genel değişken Python sınıfları

Eğer küresel diyoruz olmaz gerçi doğrudur ne var
class Shape: 
    lolwut = None 

    def __init__(self, default=0): 
     self.lolwut = default; 
    def a(self): 
     print self.lolwut 
    def b(self): 
     self.a() 
+4

ise Aşağıdaki cevabı doğru olarak kabul etmelisiniz – Clintm

cevap

53

, bir sınıf niteliği ve erişilebilir: Bir C/C++/Java kökenli geliyor

Bu doğru olduğunu varsayalım örneğin Shape.lolwut gibi bir sınıf aracılığıyla veya bir örnek yoluyla shape.lolwut ama bir örnek düzeyini ayarlar olarak ayarlanırken dikkat class özelliği olmayan özniteliği

class Shape(object): 
    lolwut = 1 

shape = Shape() 

print Shape.lolwut, 
print shape.lolwut, 

# setting shape.lolwut would not change class attribute lolwut 
# but will create it in the instance 
shape.lolwut = 2 

print Shape.lolwut, 
print shape.lolwut, 

# to change class attribute access it via class 
Shape.lolwut = 3 

print Shape.lolwut, 
print shape.lolwut 

çıkışı:

1 1 1 2 3 2 

Biri çıktı 1 1 2 2 3 3 olmasını bekliyoruz olabilir ama yanlış olur

+1

Örneklerinizi python 2.7'de test ediyorum, her şey yolunda. Ancak, Shape.lolwut öğesinin değerini ilk kez ayarladığınızda ve örnek değeri değiştiğinde. Örnek özniteliğine değer belirttiğinizde, tıpkı örnekte olduğu gibi, sınıf düzeyinin değerini değiştirseniz bile ikisi aynı olmaz. – x4snowman

+0

@Danyun Ben de test ettim. Bahsettiğin aynı durumu gördüm. Bunun neden böyle olduğunu biliyor musun? Özniteliği sınıf düzeyinden değiştirdiğinizde, örnek de değişir. Ancak, ilk önce örnek düzeyini değiştirdiğinizde, Sınıf seviyesinden değişiklik yaptığınızda, tekrar örneklemeyi etkilemez. – user1167910

+0

@ user1167910 https://docs.python.org/2.7/reference/datamodel.html adresindeki python belgelerine başvurun, 'Öznitelik atamaları ve silme işlemleri, sözlüğün sözlüğünü günceller, asla bir sınıfın sözlüğü' – x4snowman