2012-05-21 101 views
0

我對Oops有點新鮮感,並且對Python類感到困惑。雖然我在高中時學過C++,但我知道自己研究的是C++(根本就不是C++) C與類,沒有模板,STL或命名空間)Python類和對象

如果我錯了,請糾正我,但對於我來說,類只是對象的藍圖,對不對?

現在,如果我想創建一個在C類的一個實例++(對於例如,我的類名是「動物」)

我這樣做: animal lion; 或者,如果我有一個構造函數(帶參數),那麼只有我會做這個animal tiger(4,5);

我現在面臨的問題是:

class animal: 
    val = 5 

它只是一個基本類,沒有任何constuctor或方法:

現在與Python我能夠引用的動物,因爲它是不創造任何情況下(我coudn't做,在C++中,對不對?)

animal.val = 7 

我面臨的另一個問題是,我需要在創建實例時總是使用括號,否則會引用類本身。

例如;

lion = animal 
lion.val = 6 
tiger = animal 
print tiger.val 

和它打印6,當我想創建一個實例我已經使用paranthesis,即使我沒有指定任何構造函數(這是不是在C++必要),如有特殊原因或只是語言語法的問題?

回答

8

Python中的所有東西都是一個對象。 類是創建其他對象的對象。

因此,當你引用animal.val,你在animal類引用財產val

如果你想真正創建animal類型的對象,你會調用類的,並得到一個實例回:你在該實例上設置

your_animal = animal() 

任何然後僅針對該實例設置(而所有通過該類創建的對象都會共享該類的更改)。

有關Python中類的更多詳細信息,請參閱here

+0

所以使用括號其實只是一種語言的語法和沒有提到任何具體的東西? –

+0

但是如果我沒有構造函數,爲什麼仍然需要括號? –

+0

@KartikAnand:你確實有一個構造函數,你只是沒有自己寫。 – geoffspear

2

現在與Python我能夠引用的動物,因爲它是不 創建的任何實例(我coudn't做,在C++中,對不對?)

您已經聲明瞭一個靜態變量。正如你所看到的,如果沒有關鍵字,它會變得有點混亂。你所做的和C++類中的static相同

要創建一個實例變量,它需要明確地分配給實例。

class animal:  
    def __init__(self): 
    self.val = 0 


your_animal = animal() 
your_animal.val = 3 

animal.val已不再是全球可用的。

2

要顯示類比C++(順便說一句這是很好的做法,申報與資本名字clases,從構件是由convetion小寫區分類):

class Animal: 
    val = 4 # class variable 

    def __init__ (self, val = 0): # constructor (takes 0 or 1 argument) 
    self.member_val = val # instance variable 

你叫animal = Animal(5)創建新實例。觀看如何Animal.valanimal.val不同:

animal = Animal(5) 
print Animal.val, animal.member_val 
>>> 4 5 

在C++等效代碼如下:

class Animal { 
    public: 
    Animal() { // constructor with no arguments 
     this.member_val = 0; 
    } 

    Animal(int val) { // constructor with argument 
     this.member_val = val; 
    } 

    public: 
    int member_val; // member (instance) variable allocated for each instance 
    static int val = 4; // class level static variable 
} 

和類用法:

Animal animal = new Animal(5); 
cout << Animal.val << " " << animal.member_val 

>>> 5 4 
+0

感謝您對C++的比喻確實幫助我處理了一些查詢 –