__str__、创建子类对象,子类与父类函数名相同问题

1、__str__(self):

为内置函数,这个方法只能返回str,并且只能有self这一个参数,其他的,自行发挥。

用法:

不使用此方法时,代码会出现以下结果:

class Friend():

def __init__(self, name):

self.name = name

if __name__ == '__main__':

friend = Friend('Liang')

print friend

那么在申明一个实例对象friend并打印其信息时,python返回的是它的存储地址

<__main__ .Friend instance at 0x7ff3596c>

使用该方法的时候,会出现以下结果:

class Friend():

def __init__(self, name):

self.name = name

def __str__(self):

return "Friend : %s" % self.name

if __name__ == '__main__':

friend = Friend('Liang')

print friend

此时,打印出的内容为:

Friend name : Liang

2、子类与父类函数重载时,即子类中有一个函数名与父类相同,但是传入的参数个数不同时,在创建了子类对象之后,调用该函数,传入的参数只能与子类中参数个数一致,不能跳过子类,通过修改参数的个数与父类相同来直接调用父类。

原始代码如下所示:

class Person():  #父类

def __init__(self,name,job = None,pay = 0):

self.name = name

self.job = job

self.pay = pay

def lastName(self):

return(self.name.split()[-1])

def giveRaise(self,percent):

self.pay = int(self.pay * (1 + percent))

def __str__(self):   #此方法可通过打印对象名将其对应内容显示出来而不是打印该对象的存储地址

return '[Person: %s %s]' % (self.name,self.pay)


class Manager(Person): #子类

def giveRaise(self,percent,bonus = 0.1): #与父类函数名相同,参数个数不同的函数,且该函数为在原来的函数基础上略做修改,以便函数的维护,因为如果以后要改变工资涨幅的形式,则只需要修改父类的此函数,而不需要两个函数都要修改。

Person.giveRaise(self, percent + bonus)


if __name__ == '__main__':

bob = Person('bob smith')

sue = Person('sue jones',job = 'dev',pay = 10000)

print (bob.lastName(),bob.name,bob.pay)

sue.giveRaise(0.1)

print(sue.lastName(),sue.name,sue.pay)

print(bob) #因有__str__(self)方法,故能直接打印出bob这个对象的名字和工资,而不是打印bob对象的存储地址

print(sue)

tom = Manager('tom',job = 'mar',pay = 50000)

print(tom.name,tom.pay)

tom.giveRaise(0.1)#参数个数与子类相同

print (tom.pay)

print(tom)

你可能感兴趣的:(__str__、创建子类对象,子类与父类函数名相同问题)