@wenshizhang
2016-08-18T08:53:11.000000Z
字数 2004
阅读 414
suse实习 python
这一节主要是说面向对象三大特性其中的两个:继承和多态。至于封装这个特性,并没有太多的感受,暂且不提。
在python中,被继承的类称为超类或者基本类,而继承基本类的被称为导出类或子类。
OOP三大特性之一,继承为代码重用提供了便利。在创建类的时候,把类的共性抽象出来,创建为基本类,特性创建为子类,子类继承基本类。比如说我们需要创建一个描述学校成员的类,学校的成员有老师和学生。他们的共性就是,姓名,性别和年龄。学生的特性是成绩,老师的特性是薪水。所以我们先创建一个含有姓名、性别和年龄的基本类出来。
class schoolmember:def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sexdef print_info(self): print 'Name is %s, Age is %s, Sex is %s' %(self.name,self,age,self,sex) #用元组方式输出
创建出了school member类,这个是每一个学校成员的共性。接下来分别创建学生类和老师类继承school member类。
#学生类class student(schoolmember):def __init__(self,name.age,sex,mark): schoolmember.__init__(self,name,age,sex) self.mark = markdef print_info(self) schoolmember.tell(self) print 'Mark is %s' %self.mark#老师类class teacher(schoolmember):def __init__(self,name,age,sex,salary) schoolmember.__init__(self,name,age,sex) self.salary = salarydef tell(self) schoolmember.tell(self) print 'Salary is %s' %self.salary
上面的代码中有两点需要注意:第一,我们分别在student类和teacher类的init方法中显式调用了基本类的init方法,这说明子类不会调用 基本类的构造函数,如果想要执行基本类的init函数,需要显式调用;第二,如果子类和基本类有一个重名的方法(如上例中的每一个类中都有一个tell方法),子类的实例会调用子类中的方法,如果子类中没有此方法,才会去查看基本类。
python允许多重继承,如果在继承元组中列出了多个类,就是多重继承。
class A (B,C)
在解释多态的概念之前,先来说说如果父类和子类有一个同名的方法,或出现什么情况。不要随便猜测结果,先实现一个run起来看结果。
class animal():def run(self) print 'Hello, this is animal...'class cat(animal):def run(self): print 'Hello, this is cat...'class dog(animal):def run(self): print 'Hello, this is dog...'a = animal()c = cat()d = dog()a.run()c.run()d.run()
定义一个animal类,然后在定义一个dog和cat类,dog和cat类都继承了animal类,这三个类都实现了run方法——打印出该类的名称。a是animal的实例,c是cat类的实例,d是dog类的实例。运行每一个实例的run方法,输出是:
Hello,this is animal...Hello, this is cat...Hello, this is dog...
如果子类中有和父类同名的方法,子类中的方法会”屏蔽“父类中的方法。而且子类和父类还有这样一个关系,c不仅仅是子类cat的实例,c也可以当作是父类animal的实例。
isinstance(c,animal)输出是True
此时如果想要定义一个函数,可以根据传入参数的不同打印不同的信息。函数的参数可以定义成animal类型,因为任何一个animal子类的实例也是animal类型的实例。
def always_run(animal):print animal.run()
这个函数会根据传入参数的不同,调用不同类的run方法。此时如果增加一个类,fish。而fish类并没有run方法,结果会怎么样呢?
class fish(animal):pass...f = fish()f.run()输出是:Hello,this is animal
为什么定义了一个函数,这个函数可以根据不同的类调不同的方法呢?原因就是多态。fish类的实例调用了run方法,就会调用父类的run方法。