我不再推薦舊式的Python類,尤其是在Python 3刪除它們之後。不過,我還是想知道這裏發生了什麼:舊式Python類的神奇方法查找
class MyClass:
pass
my_instance = MyClass()
str(my_instance)
這段代碼打印如下:
所以 '< 主要在0x108ec4290> .MyClass實例',我沒有任何明確的繼承,我沒有超載str方法。但是,這並沒有引起所謂的缺失方法的例外。爲什麼?
我知道,老式類有一個「實例」和「類型」和新的樣式類的概念,目的是統一這些概念。那麼Python是否會在實例隱式連接的「實例」類型上找到並調用str方法?
這裏有一些線索:
目錄(my_instance) - 返回:
['__doc__', '__module__']
型(my_instance) - 返回:
<type 'instance'>
目錄(類型(my_instance)) - 返回:
['__abs__', '__add__', '__and__', '__call__', '__class__', '__cmp__', '__coerce__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__div__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__hex__', '__iadd__', '__iand__', '__idiv__', '__ifloordiv__', '__ilshift__', '__imod__', '__imul__', '__index__', '__init__', '__int__', '__invert__', '__ior__', '__ipow__', '__irshift__', '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', '__len__', '__long__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__xor__', 'next']
任何人都可以準確地解釋舊式類中的類和類型之間的關係以及這裏發生了什麼?
我可能會這樣做,但我如果沒有定義'__str __()',並且'__repr __()'默認爲'__retr __()',那麼'__retr __()'默認爲類似於你所顯示的東西(''if它沒有被覆蓋。 –
jedwards
@jedwards:但即使如此,'__repr__'也不在舊式樣實例對象上。所以這將是同樣的魔法......只是一跳。 – jdi
@jedwards是對的。如果是這樣的話,發現缺少__repr__方法有什麼「魔力」? –