[关闭]
@wenshizhang 2016-08-18T16:53:11.000000Z 字数 2004 阅读 375

可爱的python——面向对象编程.md

suse实习 python


这一节主要是说面向对象三大特性其中的两个:继承和多态。至于封装这个特性,并没有太多的感受,暂且不提。

继承

在python中,被继承的类称为超类或者基本类,而继承基本类的被称为导出类或子类
OOP三大特性之一,继承为代码重用提供了便利。在创建类的时候,把类的共性抽象出来,创建为基本类,特性创建为子类,子类继承基本类。比如说我们需要创建一个描述学校成员的类,学校的成员有老师和学生。他们的共性就是,姓名,性别和年龄。学生的特性是成绩,老师的特性是薪水。所以我们先创建一个含有姓名、性别和年龄的基本类出来。

  1. class schoolmember:
  2. def __init__(self,name,age,sex):
  3.    self.name = name
  4.    self.age = age
  5.    self.sex = sex
  6. def print_info(self):
  7.   print 'Name is %s, Age is %s, Sex is %s' %(self.name,self,age,self,sex)  
  8.    #用元组方式输出

创建出了school member类,这个是每一个学校成员的共性。接下来分别创建学生类和老师类继承school member类。

  1. #学生类
  2. class student(schoolmember):
  3. def __init__(self,name.age,sex,mark):
  4.   schoolmember.__init__(self,name,age,sex)
  5.   self.mark = mark
  6. def print_info(self)
  7.   schoolmember.tell(self)
  8.   print 'Mark is %s' %self.mark
  9. #老师类
  10. class teacher(schoolmember):
  11. def __init__(self,name,age,sex,salary)
  12.   schoolmember.__init__(self,name,age,sex)
  13.   self.salary = salary
  14. def tell(self)
  15.   schoolmember.tell(self)
  16.   print 'Salary is %s' %self.salary

上面的代码中有两点需要注意:第一,我们分别在student类和teacher类的init方法中显式调用了基本类的init方法,这说明子类不会调用 基本类的构造函数,如果想要执行基本类的init函数,需要显式调用;第二,如果子类和基本类有一个重名的方法(如上例中的每一个类中都有一个tell方法),子类的实例会调用子类中的方法,如果子类中没有此方法,才会去查看基本类。
python允许多重继承,如果在继承元组中列出了多个类,就是多重继承。

  1. class A (B,C)

多态

在解释多态的概念之前,先来说说如果父类和子类有一个同名的方法,或出现什么情况。不要随便猜测结果,先实现一个run起来看结果。

  1. class animal():
  2. def run(self)
  3.  print 'Hello, this is animal...'
  4. class cat(animal):
  5. def run(self):
  6.  print 'Hello, this is cat...'
  7. class dog(animal):
  8. def run(self):
  9.  print 'Hello, this is dog...'
  10. a = animal()
  11. c = cat()
  12. d = dog()
  13. a.run()
  14. c.run()
  15. d.run()

定义一个animal类,然后在定义一个dog和cat类,dog和cat类都继承了animal类,这三个类都实现了run方法——打印出该类的名称。a是animal的实例,c是cat类的实例,d是dog类的实例。运行每一个实例的run方法,输出是:

  1. Hello,this is animal...
  2. Hello, this is cat...
  3. Hello, this is dog...

如果子类中有和父类同名的方法,子类中的方法会”屏蔽“父类中的方法。而且子类和父类还有这样一个关系,c不仅仅是子类cat的实例,c也可以当作是父类animal的实例。

  1. isinstance(c,animal)
  2. 输出是True

此时如果想要定义一个函数,可以根据传入参数的不同打印不同的信息。函数的参数可以定义成animal类型,因为任何一个animal子类的实例也是animal类型的实例。

  1. def always_run(animal):
  2. print animal.run()

这个函数会根据传入参数的不同,调用不同类的run方法。此时如果增加一个类,fish。而fish类并没有run方法,结果会怎么样呢?

  1. class fish(animal):
  2. pass
  3. ...
  4. f = fish()
  5. f.run()
  6. 输出是:
  7. Hello,this is animal

为什么定义了一个函数,这个函数可以根据不同的类调不同的方法呢?原因就是多态。fish类的实例调用了run方法,就会调用父类的run方法。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注