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

2024-06-16 10:50:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望有人能给我一些关于我的代码的建议? 我通过自学课程学习python,其中一项要求如下:

创建一个名为蜈蚣.py,包括一个名为“蜈蚣”的类。该类有以下要求:

  1. 一旦实例化(如果使用值调用),它会将该参数附加到内部列表:

    >>> from centipede import Centipede
    >>> ralph = Centipede()
    >>> ralph('pretzel')
    >>> ralph.stomach
    ['pretzel']
    
  2. 如果print()类,则返回内部列表的逗号分隔字符串:

    >>> ralph('pickles')
    >>> print(ralph)
    'pretzel,pickles'
    
  3. 每次在蜈蚣对象上设置属性时,它都会将该属性的名称附加到另一个内部列表中:

    >>> 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. 我可以设置属性,但是'拉尔夫腿“不返回任何内容
  4. 不起作用

我不知道我错在哪里了?在


Tags: key代码self列表属性valuehatdef
1条回答
网友
1楼 · 发布于 2024-06-16 10:50:26
  • legs和{}必须在构造函数中赋值。如果在类级别分配它们,它们就是类变量(大致相当于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

  • 为什么是混血儿?魔术方法应该在没有混音的情况下工作。另外,我不知道你想在__getattr____setattr__中完成什么,你能详细说明一下吗?

相关问题 更多 >