python继承和抽象类的实现方法

本文实例讲述了python继承和抽象类的实现方法。分享给大家供大家参考。

具体实现方法如下:

代码如下:

#!/usr/local/bin/python
# Fig 9.9: fig09_09.py
# Creating a class hierarchy with an abstract base class.
 
class Employee:
   """Abstract base class Employee"""
 
   def __init__(self, first, last):
      """Employee constructor, takes first name and last name.
      NOTE: Cannot create object of class Employee."""
 
      if self.__class__ == Employee:
         raise NotImplementedError, \
            "Cannot create object of class Employee"
 
      self.firstName = first
      self.lastName = last
 
   def __str__(self):
      """String representation of Employee"""
 
      return "%s %s" % (self.firstName, self.lastName)
 
   def _checkPositive(self, value):
      """Utility method to ensure a value is positive"""
 
      if value < 0:
         raise ValueError, \
            "Attribute value (%s) must be positive" % value
      else:
         return value
 
   def earnings(self):
      """Abstract method; derived classes must override"""
 
      raise NotImplementedError, "Cannot call abstract method"
 
class Boss(Employee):
   """Boss class, inherits from Employee"""
 
   def __init__(self, first, last, salary):
      """Boss constructor, takes first and last names and salary"""
 
      Employee.__init__(self, first, last)
      self.weeklySalary = self._checkPositive(float(salary))
 
   def earnings(self):
      """Compute the Boss's pay"""
 
      return self.weeklySalary
 
   def __str__(self):
      """String representation of Boss"""
 
      return "%17s: %s" % ("Boss", Employee.__str__(self))
 
class CommissionWorker(Employee):
   """CommissionWorker class, inherits from Employee"""
 
   def __init__(self, first, last, salary, commission, quantity):
      """CommissionWorker constructor, takes first and last names,
      salary, commission and quantity"""
 
      Employee.__init__(self, first, last)
      self.salary = self._checkPositive(float(salary))
      self.commission = self._checkPositive(float(commission))
      self.quantity = self._checkPositive(quantity)
 
   def earnings(self):
      """Compute the CommissionWorker's pay"""
 
      return self.salary + self.commission * self.quantity
 
   def __str__(self):
      """String representation of CommissionWorker"""
 
      return "%17s: %s" % ("Commission Worker",
         Employee.__str__(self))
 
class PieceWorker(Employee):
   """PieceWorker class, inherits from Employee"""
 
   def __init__(self, first, last, wage, quantity):
      """PieceWorker constructor, takes first and last names, wage
      per piece and quantity"""
 
      Employee.__init__(self, first, last)
      self.wagePerPiece = self._checkPositive(float(wage))
      self.quantity = self._checkPositive(quantity)
 
   def earnings(self):
      """Compute PieceWorker's pay"""
 
      return self.quantity * self.wagePerPiece
 
   def __str__(self):
      """String representation of PieceWorker"""
 
      return "%17s: %s" % ("Piece Worker",
         Employee.__str__(self))
 
class HourlyWorker(Employee):
   """HourlyWorker class, inherits from Employee"""
 
   def __init__(self, first, last, wage, hours):
      """HourlyWorker constructor, takes first and last names,
      wage per hour and hours worked"""
 
      Employee.__init__(self, first, last)
      self.wage = self._checkPositive(float(wage))
      self.hours = self._checkPositive(float(hours))
 
   def earnings(self):
      """Compute HourlyWorker's pay"""
 
      if self.hours <= 40:
         return self.wage * self.hours
      else:
         return 40 * self.wage + (self.hours - 40) * \
           self.wage * 1.5
 
   def __str__(self):
      """String representation of HourlyWorker"""
 
      return "%17s: %s" % ("Hourly Worker",
         Employee.__str__(self))
 
# main program
 
# create list of Employees
employees = [ Boss("John", "Smith", 800.00),
              CommissionWorker("Sue", "Jones", 200.0, 3.0, 150),
              PieceWorker("Bob", "Lewis", 2.5, 200),
              HourlyWorker("Karen", "Price", 13.75, 40) ]
 
# print Employee and compute earnings
for employee in employees:
   print "%s earned $%.2f" % (employee, employee.earnings())

输出结果如下:

Boss: John Smith earned $800.00

Commission Worker: Sue Jones earned $650.00

Piece Worker: Bob Lewis earned $500.00

Hourly Worker: Karen Price earned $550.00

希望本文所述对大家的Python程序设计有所帮助。

(0)

相关推荐

  • Python抽象类的新写法

    记得之前learn python一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下 最简单的写法 class MyCls(): def foo(self): print('method no implement') 运行的例子 >>> a = MyCls() >>> a.foo() method no implement >>> 这样虽然可以用,但是提示不明显,还是容易误用,当然,还有更好的方法 较为可以接受的写法 class

  • 在Python中定义和使用抽象类的方法

    像java一样python也可以定义一个抽象类. 在讲抽象类之前,先说下抽象方法的实现. 抽象方法是基类中定义的方法,但却没有任何实现.在java中,可以把方法申明成一个接口.而在python中实现一个抽象方法的简单的方法是: class Sheep(object): def get_size(self): raise NotImplementedError 任何从Sheep继承下来的子类必须实现get_size方法.否则就会产生一个错误.但这种实现方法有个缺点.定义的子类只有调用那个方法时才会

  • python继承和抽象类的实现方法

    本文实例讲述了python继承和抽象类的实现方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: #!/usr/local/bin/python # Fig 9.9: fig09_09.py # Creating a class hierarchy with an abstract base class.   class Employee:    """Abstract base class Employee"""      d

  • Python 继承,重写,super()调用父类方法操作示例

    本文实例讲述了Python 继承,重写,super()调用父类方法操作.分享给大家供大家参考,具体如下: demo.py(继承,重写,super): # 父类 class Dog: def bark(self): print("汪汪叫") # 子类 继承 class XiaoTianQuan(Dog): def fly(self): print("我会飞") # 可以重写父类中的同名方法 def bark(self): # super().父类方法名 调用父类中的方

  • Java基础教程之接口的继承与抽象类

    在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体.interface为类提供了接口规范. 在继承中,我们为了提高程序的可复用性,引入的继承机制.当时的继承是基于类的.interface接口同样可以继承,以拓展原interface. 接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型.比如,我们以Cup作为原interface: 复制代码 代码如下: interface Cup

  • python类:class创建、数据方法属性及访问控制详解

    在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. python中创建类 创建一个Student的类,并且实现了这个类的初始化函数"__init__": class Student(object):     count = 0     books = []     def __init__(self, name):         self.name = name 接下来就通过上面的Student类来看看Python中类的相关内容. 类构造和

  • Python中optionParser模块的使用方法实例教程

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. 示例如下: from optparse impo

  • Python单例模式的两种实现方法

    Python单例模式的两种实现方法 方法一  import threading class Singleton(object): __instance = None __lock = threading.Lock() # used to synchronize code def __init__(self): "disable the __init__ method" @staticmethod def getInstance(): if not Singleton.__instanc

  • python基于multiprocessing的多进程创建方法

    本文实例讲述了python基于multiprocessing的多进程创建方法.分享给大家供大家参考.具体如下: import multiprocessing import time def clock(interval): while True: print ("the time is %s"% time.time()) time.sleep(interval) if __name__=="__main__": p = multiprocessing.Process

  • Python实现子类调用父类的方法

    本文实例讲述了Python实现子类调用父类的方法.分享给大家供大家参考.具体实现方法如下: python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找. 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的. 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题

  • Java实例化一个抽象类对象的方法教程

    前言 最近在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方法却是可以有自己的构造方法的.这样就把我搞糊涂了,既然有构造方法,又不可以通过new来创建,那么抽象类在没变成具体类的时候究竟可不可以实例化呢? 在Java 中抽象类是不能直接被实例化的.但是很多时候抽象类的该特点成为一个比较麻烦的阻碍.例如如果我想使用动态代理来给一个抽象类赋予其执行抽象方法的能力,就会有两个困难:1. 动态代理只能创建实现接口的一个代理对象,而不能是一个继承抽

  • python实现动态创建类的方法分析

    本文实例讲述了python实现动态创建类的方法.分享给大家供大家参考,具体如下: python作为动态语言,如何在运行时动态创建类呢(python Creating classes dynamically),这在编程时,有时候很有用处,动态生成类,给予相应的属性和方法.通常来说有如下两种方式: 1. 根据条件,硬编码实现. 2. 利用 type metaclass  来实现. 根据条件硬编码 def choose_class(name): if name == 'foo': class Foo(

随机推荐