@wenshizhang
2016-08-18T16:53:11.000000Z
字数 2004
阅读 375
suse实习
python
这一节主要是说面向对象三大特性其中的两个:继承和多态。至于封装这个特性,并没有太多的感受,暂且不提。
在python中,被继承的类称为超类或者基本类,而继承基本类的被称为导出类或子类。
OOP三大特性之一,继承为代码重用提供了便利。在创建类的时候,把类的共性抽象出来,创建为基本类,特性创建为子类,子类继承基本类。比如说我们需要创建一个描述学校成员的类,学校的成员有老师和学生。他们的共性就是,姓名,性别和年龄。学生的特性是成绩,老师的特性是薪水。所以我们先创建一个含有姓名、性别和年龄的基本类出来。
class schoolmember:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def 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 = mark
def 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 = salary
def 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方法。