Python帮助高级对象:特殊方法

时间:2011-07-05 08:45:45

标签: 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. 每次在蜈蚣对象上设置属性时,它会将属性的名称附加到另一个内部列表:

    >>> ralph.shoes = 100 
    >>> ralph.hat = 1
    >>> ralph.legs['shoes', 'hat']
    
  4. 蜈蚣对象的表示必须是此第二个内部列表的逗号分隔字符串。

    >>> ralph
    'shoes,hat'
    
  5. 以下是我到目前为止编写的代码:

    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. 打印不显示列表
    4. 我可以设置属性,但'ralph.legs'不会返回任何内容
    5. 不起作用
    6. 我无法弄清楚我哪里出错了?

1 个答案:

答案 0 :(得分: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__中完成什么,请详细说明一下?