本文深入分析了Python面向对象程序设计OOP。分享给大家供大家参考,具体如下:
下面是一个关于OOP的实例,模块文件为person.py
# File person.py(start)class Person: def __init__(self, name, job=None, pay=0): self.name = name self.job = job self.pay = pay def last_name(self): return self.name.split()[-1] def give_raise(self, percent): self.pay = int(self.pay * (1+percent)) print('total percent:%f' % percent) def __str__(self): return '[Person: %s, %s]' % (self.name, self.pay)class Manager(Person): # 这是一种不太好的方法重载的方法,实际应用中我们采用下面的方法 def give_raise(self, percent, bonus=.1): self.pay = int(self.pay * (1+percent+bonus)) # 这个方法利用了这样的一个事实:类方法总是可以在一个实例中调用。 # 其实常规的实例调用,也是转换为类的调用 # instance.method(args...) 由Python自动地转换为 class.method(instance,args...) # 所以要记得直接通过类进行调用时,必须手动传递实例,这里就是self参数 # 而且不能写成self.give_raise,这样会导致循环调用 # # 那么为什么采用这种形式呢?因为它对未来的代码的维护意义重大,因为give_raise现在 # 只在一个地方,即Person的方法,将来需要修改的时候,我们只需要修改一个版本 def give_raise(self, percent, bonus=.1): Person.give_raise(self, percent+bonus)if __name__ == '__main__': # self-test code bob = Person('Bob Smith') sue = Person('Sue Jones', job='dev', pay=100000) print(bob) print(sue) print(bob.last_name(), sue.last_name()) sue.give_raise(.1) print(sue) print('-'*20) tom = Manager('Tom Jones', 'mgr', 50000) tom.give_raise(.1) print(tom.last_name()) print(tom) print('--All three--') for obj in (bob, sue, tom): obj.give_raise(.1) print(obj)
这个示例定义了Person类,并且Person类的构造函数采用了默认关键字参数,重载了__str__方法用以print输出,定义了得到last_name的方法,定义了give_raise涨工资方法。类Manager继承自Person,Manager重新定义了自己的give_raise方法,获得额外的bonus=0.1的奖金。
在代码最后,写了自测试的代码if __name__ == '__main__'
,用以测试。输出如下:
[Person: Bob Smith, 0]
[Person: Sue Jones, 100000]
Smith Jones
total percent:0.100000
[Person: Sue Jones, 110000]
--------------------
total percent:0.200000
Jones
[Person: Tom Jones, 60000]
--All three--
total percent:0.100000
[Person: Bob Smith, 0]
total percent:0.100000
[Person: Sue Jones, 121000]
total percent:0.200000
[Person: Tom Jones, 72000]
这里也可以给Manager增加自己独有的方法。
定制构造函数
现在的代码可以正常工作,但是,如果仔细研究会发现,当我们创建Manager对象的时候,必须为它提供一个mgr工作名称似乎没有意义:这已经由类自身暗示了。
新闻热点
疑难解答