2014-01-31 51 views
-3
class Dog: 
    def __init__(self,name): 
     self.char=name 
    def __str__(self): 
     return self.char 

>>> spok=Dog("dsakj") 
>>> print(spok) 
dsakj  

class Dog: 
    def __init__(self,name): 
     self.name=name 
    def __str__(self): 
     return self.name 

>>> spok=Dog("akjds") 
>>> print(spok) 
akjds 

class Dog: 
    def __init__(self,name): 
     self.name=name 
    def __info__(self): 
     return self.name 

>>> spok=Dog("dnask") 
>>> print(spok) 
<__main__.Dog object at 0x0000000002FF5320> 

第三个改变的唯一的东西就是名字,然后它没有成功。python类的特殊方法需要特殊名称吗?

+0

请不要不小心格式化正确。我们可能错误地明白你想问什么。 – glglgl

+4

这是为什么令人惊讶?为了将一个自定义对象转换为一个字符串,Python调用特殊方法'__str__',是的。所有特殊的魔法方法都有固定的名字。 –

+2

恩,是的。这就是为什么它是“特殊的”。 – BrenBarn

回答

3

当您打印一个对象时,隐式调用'toString'方法(__str__)。如果没有这个方法(你在第三个例子中缺少),Python不知道如何将任意对象转换为字符串。

0

特殊方法被函数调用。如果你想编写自己的功能信息,你可以做这样的:

def info(obj): 
    if hasattr(obj,'__info__'): 
     return obj.__info__() 
    raise Exception('Not informable object') 

class Dog: 
    def __init__(self, name): 
     self.name = name 

    def __info__(self): 
     print 'Informational note about class named : %s'%self.name 

sparky = Dog('sparky') 
info(sparky) 

'Informational note about class named : sparky' 

编辑对信息的缘故

蟒蛇的开放性可以让你做这样的事情,即使你有编码约定像这个PEP 0008,谢谢@丹尼尔的建议

+4

PEP8专门[推荐](http://www.python.org/dev/peps/pep-0008 /#descriptive-naming-styles)使用双下划线名称来表示Python自己记录的接口以外的任何内容。 –

+0

你必须不要那样的事情,但你可以做那样的事情,只是告诉你能够这样做,但重要的是要注意不建议,谢谢。 – markcial