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

0 投票
1 回答
707 浏览
提问于 2025-04-16 20:51

我希望有人能给我一些关于我的代码的建议。现在我正在通过自学课程学习Python,其中一个作业的要求如下:

创建一个名为centipede.py的程序,里面包含一个名为“Centipede”的类。这个类有以下要求:

  1. 一旦实例化,如果用一个值调用它,它会把这个值添加到一个内部列表中:

    >>> from centipede import Centipede
    >>> ralph = Centipede()
    >>> ralph('pretzel')
    >>> ralph.stomach
    ['pretzel']
    
  2. 如果你打印这个类,它会返回一个用逗号分隔的内部列表的字符串:

    >>> ralph('pickles')
    >>> print(ralph)
    'pretzel,pickles'
    
  3. 每次给centipede对象设置一个属性时,它会把这个属性的名字添加到另一个内部列表中:

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

    >>> 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 个回答

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? 这些魔法方法应该可以在没有 mixin 的情况下正常工作。另外,我不太明白你在 __getattr____setattr__ 中想要实现什么,可以详细说说吗?

撰写回答