本文深入分析了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工作名称似乎没有意义:这已经由类自身暗示了。
所以,为了改善这点,我们要重新定义Manager中的__init__ 方法,从而提供mgr字符串,而且和give_raise的定制一样,通过类名的调用来运行Person中最初的__init__ 。
def __init__(self, name, pay):
Person.__init__(self, name, 'mgr', pay)
那么之后的实例化就变成了:
tom = Manager('Tom Jones', 50000)
OOP比我们认为的简单
这是Python的OOP机制中几乎所有重要的概念:
- 实例创建
|