首页 > 编程 > Python > 正文

Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等

2020-02-16 00:30:27
字体:
来源:转载
供稿:网友

本文深入分析了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工作名称似乎没有意义:这已经由类自身暗示了。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表