2011-07-05 52 views
0

我希望有人能給我一些關於我的代碼的建議嗎? 我通過自學課程學習python,其中一項需求如下:Python幫助高級對象:特殊方法

創建一個名爲centipede.py的程序,其中包括一個名爲「Centipede」的類。這個類有以下要求:

  1. 如果調用一個價值一旦被實例化,它附加這樣的說法對內部列表:

    >>> from centipede import Centipede 
    >>> ralph = Centipede() 
    >>> ralph('pretzel') 
    >>> ralph.stomach 
    ['pretzel'] 
    
  2. 如果打印()的類,它返回一個內部列表的逗號分隔的字符串:

    >>> ralph('pickles') 
    >>> print(ralph) 
    'pretzel,pickles' 
    
  3. 每個屬性被蜈蚣對象上設置時間,它附加屬性的名稱ANOT她的內部清單:

    >>> ralph.shoes = 100 
    >>> ralph.hat = 1 
    >>> ralph.legs['shoes', 'hat'] 
    
  4. 蜈蚣對象的形式必須是一個逗號分隔的第二個內部列表的字符串。

    >>> ralph 
    'shoes,hat' 
    

這裏是到目前爲止我所編寫的代碼:

class MixIns:  
    def __setattr__(self, key, value): 
     print("ATTR: setting attribute {0!r} to {1!r}".format(key, value)) 
     self.__dict__[key] = value 


    def __getattr__(self, key): 
     print("ATTR: getting attribute {0!r}".format(key)) 
     self.__setattr__(key, "No value") 
     return "No value" 



class Centipede(MixIns): 
    legs = [] 
    stomach = [] 

    def __init__(self): 

     MixIns.__init__(self) 

    def __str__(self): 
     return self.name 

    def __call__(self, *args): 
     [self.stomach.append(arg) for arg in args] 

    def __repr__(self): 
     return ','.join(self.legs) 

這些是通過命令行運行上面的代碼的結果:

  1. 排序的作品我可以創建實例但無法設置屬性
  2. 打印不顯示列表
  3. 我可以設置屬性,但「ralph.legs」不返回任何
  4. 不工作

我想不通我要去的地方錯了嗎?

+1

代碼通過用四個空格縮進來進行格式化。 8在列表中。 –

+1

順便說一句,提示:在你的'__call__'方法中,你使用列表理解來將參數附加到另一個列表。這意味着你正在創建另一個大小爲args的列表(由'None'填充,因爲這是每次調用時返回的'append')在列表中追加內容,因此無意中浪費內存。你應該用一個簡單的'for'循環替換它。 –

回答

5
  • legsstomach在構造進行分配。如果你在類級別分配他們,他們是類變量(大致相當於Java的靜態成員)。像這樣做

    def __init__(self): 
        self.legs = [] 
        self.stomach = [] 
    
  • __call__方法有點太複雜了。這已經足夠了:

    def __call__(self, item): 
         self.stomach.append(item) 
    
  • 如果你print一個對象時,它會通過__str__轉換。您可以嘗試與

    class Tester(object): 
        def __str__(self): 
         return 'str' 
    print Tester() 
    

    所以,你__str__有返回加入stomach

  • 爲什麼混入?神奇的方法應該沒有mixin的工作。此外,我不知道你在__getattr____setattr__想要完成什麼,請你詳細說明一下嗎?

+0

感謝您的解釋keppla __getattr__和__setattr__是在那裏向我展示魔術方法中發生了什麼。 – pythlanx

+0

有沒有必要把'__getattr__'和'__setattr__'放在一個單獨的類中,你可以把它們放在蜈蚣中。另外,你在'__getattr__'中調用'__setattr__',這看起來很奇怪。正如我理解你的任務,你只需要__setattr__,將名稱追加到'腿'。 – keppla

+0

好的,謝謝我會通過我的代碼,並作出建議的變化,只需清楚__str__應返回以下內容:'code'return','。join(self.stomach)? – pythlanx