python中类似__init__()
、__str__()
这样的特殊方法,其内在逻辑是怎样的?为什么要定义这样的特殊方法:
1、比如定义一个新类,如果不写__init__()
是否意味着该类会隐式的调用基类的__init__()
,或者说该类就无法进行实例化?
2、在新类中定义的特殊方法比如__init__()
等,是否实质上就是对基类对应的特殊方法进行重写?
3、__str__()
函数同str()
函数有什么联系和区别?
4、下例print函数在有无__str__()
下输出的结果完全不一样,那么print 函数和__str__()
以及str()
的关系是怎样的?
class intSet(object):
def __init__(self):
self.vals = []
def __str__(self):
self.vals.sort()
return '{' + ','.join([str(e) for e in self.vals]) + '}'
def num(self):
return len(self.vals)
def insert(self, e):
if not e in self.vals:
self.vals.append(e)
def member(self, e):
"""Assumes e is an integer
return e in self.vals
def remove(self, e):
try:
self.vals.remove(e)
except:
raise ValueError(str(e) + ' not found')
`
如果不注释掉__str__()
>>> s
<__main__.intSet object at 0x000000000A7E3518>>>> print s
{3,4,5}
如果注释掉__str__()
>>> print s
<__main__.intSet object at 0x000000000A7E35F8>
__str__()
用于将值转化为适于人阅读的形式
因为类本身是一个object
,print
一个类时,默认是显示他是一个对象
如果在类中定义__str__()
,他会去运行__str__()
方法
基类的
__init__()
要显式调用是重写,
python
实现多态的方法,可以通过super()
方法来调用基类中的方法具体是怎么样,不清楚,我猜
str()
方法应该会调用参数的__str__()
方法,类似的还有len()
、next()
等print
是会将参数转成str
类型的,默认实现是对象的地址