2011-07-05 24 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