类初体验, 类的继承,类的组合,菱形继承,子类派生的新方法中重用父类的功能,抽象类多态多态性
类初体验
class OldboyStudent: school='oldboy' def __init__(self, x, y, z): #会在调用类时自动触发 self.name = x #stu1.name='耗哥' self.age = y #stu1.age=18 self.sex = z #stu1.sex='male' def choose_course(self,x): print('%s is choosing course' %self.name) def func(): pass # 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的 # 对象名称空间中定义的只有数据属性,而且时对象所独有的数据属性 stu1=OldboyStudent('耗哥',18,'male') stu2=OldboyStudent('猪哥',17,'male') stu3=OldboyStudent('帅翔',19,'female') # print(stu1.name) # print(stu1.school) # 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个 # print(OldboyStudent.choose_course) # OldboyStudent.choose_course(123) # 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的, #绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入 # print(id(stu1.choose_course)) # print(id(stu2.choose_course)) # print(id(stu3.choose_course)) # print(id(OldboyStudent.choose_course)) # print(id(stu1.school)) # print(id(stu2.school)) # print(id(stu3.school)) # # print(id(stu1.name),id(stu2.name),id(stu3.name)) # stu1.choose_course(1) # stu2.choose_course(2) # stu3.choose_course(3) stu1.func() # 补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self
类的继承
1、什么是继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 强调:继承是类与类之间的关系 2、为什么用继承 继承的好处就是可以减少代码的冗余 3、如何用继承 在python中支持一个类同时继承多个父类 在python3中 如果一个类没有继承任何类,那默认继承object类 在python2中: 如果一个类没有继承任何类,不会继承object类 新式类 但凡继承了object的类以及该类的子类,都是新式类 经典类 没有继承object的类以及该类的子类,都是经典类 在python3中都是新式类,只有在python2中才区别新式类与经典类
类的组合
1、什么是组合 组合就是一个类的对象具备某一个属性,该属性的值是指向另外外一个类的对象 2、为何用组合 组合也是用来解决类与类直接代码冗余问题的 3、如何用组合 class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex,stu_id): OldboyPeople.__init__(self,name,age,sex) self.stu_id=stu_id def choose_course(self): print('%s is choosing course' %self.name) class OldboyTeacher(OldboyPeople): def __init__(self, name, age, sex, level): OldboyPeople.__init__(self,name,age,sex) self.level=level def score(self,stu,num): stu.score=num print('老师[%s]为学生[%s]打分[%s]' %(self.name,stu.name,num)) stu1=OldboyStudent('猪哥',19,'male',1) tea1=OldboyTeacher('egon',18,'male',10) stu1.choose_course() tea1.score(stu1,100) print(stu1.__dict__)
类的菱形继承,python2与python3的区别
#coding:utf-8 ''' 1、菱形继承 当一个子继承多个父类时,多个父类最终继承了同一个类,称之为菱形继承 2、菱形继承的问题: python2区分经典类与新式类,如果子的继承是一个菱形继承,那么经典类与形式的区别为? 经典类下查找属性:深度优先查找 新式类下查找属性:广度优先查找 在python3中全是新式类,没有继承object默认继承 ''' class G(object): def test(self): print('from G') pass class E(G): def test(self): print('from E') pass class B(E): def test(self): print('from B') pass class F(G): def test(self): print('from F') pass class C(F): def test(self): print('from C') pass class D(G): def test(self): print('from D') pass class A(B,C,D): def test(self): print('from A') # pass obj=A() print(A.mro()) # obj.test() #A->B->E-C-F-D->G-object
子类派生的新方法中重用父类的功能的2种方法
# 在子派生的新方法中重用父类功能的两种方式 # 方式一:与继承无关 #指名道姓法,直接用:类名.函数名 # class OldboyPeople: # school = 'oldboy' # # def __init__(self, name, age, sex): # self.name = name # self.age = age # self.sex = sex # # class OldboyStudent(OldboyPeople): # def __init__(self,name,age,sex,stu_id): # OldboyPeople.__init__(self,name,age,sex) # self.stu_id=stu_id # # def choose_course(self): # print('%s is choosing course' %self.name) # 方式二:严格以来继承属性查找关系 # super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系) # super().__init__(不用为self传值) # 注意: # super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super() # class OldboyPeople: # school = 'oldboy' # # def __init__(self, name, age, sex): # self.name = name # self.age = age # self.sex = sex # # class OldboyStudent(OldboyPeople): # def __init__(self,name,age,sex,stu_id): # # OldboyPeople.__init__(self,name,age,sex) # super(OldboyStudent,self).__init__(name,age,sex) # self.stu_id=stu_id # # def choose_course(self): # print('%s is choosing course' %self.name) # # # stu1=OldboyStudent('猪哥',19,'male',1) # print(stu1.__dict__) # # print(OldboyStudent.mro())
抽象类,多态,多态性
''' 1 什么是多态 多态指的是同一种事物的多种形态 水-》冰、水蒸气、液态水 动物-》人、狗、猪 2 为和要用多态 多态性: 继承同一个类的多个子类中有相同的方法名 那么子类产生的对象就可以不用考虑具体的类型而直接调用功能 3 如何用 ''' import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def speak(self): pass @abc.abstractmethod def eat(self): pass # Animal() #强调:父类是用来指定标准的,不能被实例化 class People(Animal): def speak(self): print('say hello') def eat(self): pass class Dog(Animal): def speak(self): print('汪汪汪') def eat(self): pass class Pig(Animal): def speak(self): print('哼哼哼') def eat(self): pass peo1=People() dog1=Dog() pig1=Pig() # # # peo1.speak() # dog1.speak() # pig1.speak() # python推崇的是鸭子类型,只要你叫的声音像鸭子,并且你走路的样子也像鸭子,那你就是鸭子