python类的继承、封装和多态

继承

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
class Student(Person):
   def __init__(self, name, gender,score):                        #score属性是子类自己的属性
        super(Student,self).__init__(name,gender)                 #super(子类名称,self).__init__(继承父类的属性1,属性2):初始化父类,继承Person父类的name和gender属性
        self.score=score

除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。

多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

#哪类人
class Person(object):
    pass

class Student(Person):
    pass

class Teacher(Person):
    pass

class SkillMixin(object):
    pass

#技能类
class BasketballMixin(SkillMixin):
    def skill(self):
        return 'basketball'

class FootballMixin(SkillMixin):
    def skill(self):
        return 'football'

#拥有哪种技能的人的类型
class BStudent(Student, BasketballMixin):                               #既是学生,又会打篮球的人,即继承学生类,也继承篮球技能类,多重继承
    pass

class FTeacher(Teacher, FootballMixin):
    pass

s = BStudent()
print s.skill()

>>> basketball 

t = FTeacher()
print t.skill()
>>> football

多态

class Person(object):
     def __init__(self,name):
          self.name=name
     def a(self):                                               #Person父类的a方法
          return 'I am a Person,my name is %s' %self.name
class Student(Person):
      def __init__(self,name,age):
           super(Student,self).__init__(name)
           self.age=age
      def a(self):                                              #Student子类的a方法
          return 'I am a Student,my name is %s' %self.name    
class Teacher(Person):
      def __init__(self,name,score):
           super(Teacher,self).__init__(name)
           self.score=score
      def a(self):                                              #Teacher子类的a方法
          return 'I am a Teacher,my name is %s' %self.name    
def show_a(x):                                                  #定义一个方法,用于接收x参数,返回每个类实例对象相对应的方法
     print a()


p=Person('Bob')
s=Student('Alice',12)
t=Teacher('Lily',80)


结果:
>>> show_a(p)
I am a Person,my name is Bob

>>> show_a(s)
I am a Student,my name is Alice

>>> show_a(t)
I am a Teacher,my name is Lily

结果返回子类自己的方法,但当子类的方法找不到时会顺着子类找到父类相对应的方法

 封装

将细节封装起来提供一个接口被访问,有效地保证了细节的安全。

class Person(object):
      def __init__(self):
           self.__name='a'
     @property                                   #使用@property将一个方法name变成属性,可以直接.name访问
      def name(self):                            #封装self.__name属性
           return self.__name                    

p1=Person()
p1.name                                          #p1.name可以直接访问name方法
原文地址:https://www.cnblogs.com/evablogs/p/6724477.html