2012-03-06 89 views
0

對於面向對象的編程,我很新,所以一些抽象的想法對我來說有點模糊。我正在爲舊的遊戲語言撰寫翻譯。部分原因使得我需要從所述語言實現自定義類型,並將它們放置在堆棧上以根據需要進行操縱。在列表中放置自定義類對象

現在,我可以把一個字符串放在列表中。我可以在列表中添加一個數字,我甚至發現我可以將符號放在列表中。但是我對如何將一個自定義對象實例放在一個列表中時有點模糊,因爲我不能將它放入一個變量中(因爲畢竟,我不知道會有多少,哪些不能當代碼正在運行時,請手動定義它們:)

我爲最簡單的數據類型之一--DBREF做了一個類。 DBREF只包含一個數據庫引用號。我不能只使用整數,字符串,字典等,因爲在我必須實現的語言中存在類型檢查機制,這會混淆事物,因爲這些機制已經在其他關係類似物中使用過。

這裏是我的代碼和我背後的推理:

class dbref: 
     dbnumber=0 
     def __init__(self, number): 
      global number 
      dbnumber=number 
     def getdbref: 
      global number 
      return number 

我創建了一個名爲類DBREF。它所做的(現在)是取一個數字並將其存儲在一個變量中。我希望如果我這樣做:

examplelist=[ dbref(5) ] 

dbref對象將在堆棧​​上。那可能嗎?此外,我將能夠做到:

if typeof(examplelist[0]) is dbref: 
     print "It's a DBREF." 
    else: 
     print "Nope." 

......或者我誤解了Python類的工作方式?另外,我的班級定義是不是以任何方式?

+0

在Python中,對象自動爲您管理對象生命週期,因此您不必擔心對象存儲在哪裏(順便說一句,所有對象都存儲在堆中)。與'typeof'等價的是'isinstance':'if isinstance(examplelist [0],dbref)'然而,你不應該那樣做,而是要利用鴨子打字來代替(只要與對象一起工作就好像它是一個'dbref')。 – 2012-03-06 20:47:22

+0

與這個問題沒有關係,但是你幾乎總是希望避免Python中的'global',當你看到它時總是提出問題=) – 2012-03-06 21:04:25

回答

1

如果您使用...

class dbref: 
    dbnumber=0 

,將共享類的所有實例中相同的號碼,因爲dbnumber將是一個類屬性,而不是實例屬性。試試這個:

class dbref(object): 

    def __init__(self, number): 
     self.dbnumber = number 

    def getdbref(self): 
     return self.dbnumber 

self是對象實例本身多數民衆贊成由Python中,當你調用該實例的方法之一自動傳遞一個參考。

+0

啊,謝謝!我能否像我期望的那樣將dbref對象放入列表中? – Kelketek 2012-03-06 20:50:43

+0

當然。你可以在列表中放置幾乎任何東西。只需通過調用類創建一個實例:'my_dbrefs = []; my_dbrefs.append(dbref(13))'或者你有什麼。 – Amber 2012-03-06 20:51:07

相關問題