Python帮助 高级对象:特殊方法
我希望有人能给我一些关于我的代码的建议。现在我正在通过自学课程学习Python,其中一个作业的要求如下:
创建一个名为centipede.py的程序,里面包含一个名为“Centipede”的类。这个类有以下要求:
一旦实例化,如果用一个值调用它,它会把这个值添加到一个内部列表中:
>>> from centipede import Centipede >>> ralph = Centipede() >>> ralph('pretzel') >>> ralph.stomach ['pretzel']
如果你打印这个类,它会返回一个用逗号分隔的内部列表的字符串:
>>> ralph('pickles') >>> print(ralph) 'pretzel,pickles'
每次给centipede对象设置一个属性时,它会把这个属性的名字添加到另一个内部列表中:
>>> ralph.shoes = 100 >>> ralph.hat = 1 >>> ralph.legs['shoes', 'hat']
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)
这是通过命令行运行上面代码的结果:
- 有点儿能用,我可以创建一个实例,但不能设置属性
- 打印出来的不是一个列表
- 我可以设置属性,但'ralph.legs'没有返回任何东西
- 不工作
我不知道哪里出错了?
1 个回答
5
legs
和stomach
必须在构造函数里赋值。如果你在类的层面上赋值,它们就变成了类变量(大致相当于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__
中想要实现什么,可以详细说说吗?