8.27(day24)继承介绍,属性查找的菱形问题,继承重用父类的两种方法,绑定方法的特殊之处,mro列表

复习

# 类与对象
# class Student:
#     school = 'oldboy'
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#     def study(self):
#         self.degree = 'benke'
#     def change_name(self,new_name):
#         self.name = new_name
#     def wife(self,obj):
#         self.my_wife = obj
#
# class Person:
#     school = 'oldboy'
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#
# stu1 = Student('nick',48)
# 调用类类名():实例化产生一个空对象,去调用__init__方法,完成
# 对象的初始化
# stu1.sex = 'male'
# # print(stu1.sex)
# stu1.study()
# print(stu1.degree)
#
# stu1.change_name('wangredan')
# print(stu1.name)
#
# wife = Person('erya',18)
# stu1.wife(wife)
# print(stu1.my_wife.age)


# 对象有:数据属性(变量),方法属性(方法)
# 对象中可以嵌套对象
# 往对象中放属性的方式
# __init__   对象.属性   对象.方法(在方法中放属性)
# 属性查找顺序:先从对象中招,去类中招,没了报错
# __init__:类加括号完成实例化,会自动调用
# 绑定方法:类来调用普通函数,有几个形参传几个实参
# 对象调用时,第一个可以不用传
# 一切皆对象

类的继承

# 类的继承:
# IDE集成开发环境
# 继承介绍
# 什么是继承:继承是一种新建类的方式,继承了一个类,类中的属性和方法
# 就在子类中
# 父类/基类   子类/派生类
# 新式类:只要继承了object的类就是新式类
# python3中默认继承object
# 经典类:没有继承object的类就是经典类
# python2需要显示指定继承object类
# python3中没有经典类,python2才有经典类

# class A:
#     pass
# class B(A):
#     pass
# __xxxx__类的内置属性
# B.__name__
# print(B.__name__ )
# print(B.__dict__)
# 查看父类
# 类名.__bases__
# 多继承
# class A(B,C):

利用继承减少代码冗余

# class Person:
#     school='oldboy'   #减少了代码量
# class Teacher(Person):
#
#     def __init__(self,name,age,level):
#         self.name=name
#         self.age=age
#         self.level=level
#
# class Student(Person):
#
#     def __init__(self,name,age,course):
#         self.name=name
#         self.age=age
#         self.course=course
#
# stu1=Student('wgj',20,'python')
# # stu1.school='xxx'
# print(stu1.school)

属性的顺序查找(菱形问题)

# 2.属性的查找顺序
# 先找对象----类中找----父类中(多继承)----报错
# 3.如何重用父类的方法
# class Person:
#     school='oldboy'   #减少了代码量
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#
# class Teacher(Person):
#     pass
# class Student(Person):
#     pass
# 类实例化会调用__init__ 如果类中没有,去父类中找
# stu1=Student('wgj',20)
# print(stu1.school)

# 多层继承
# class A:
#     a='A'
# class B(A):
    # a='B'
# class C():
#     pass
    # a='C'
# class D(C,A):
    # a='D'
    # pass
# d=D()
# print(d.a)

# 多继承
# class A:
#     a='A'
# class B():
#     a='B'
# class C():
#     # pass
#     a='C'
# class D(A,B,C):   #按括号中从左往右找
#     a='D'
#     # pass
# d=D()
# print(d.a)

# 多继承多层继承混合查找
# class A:
#     a='A'
# class B():
#     a='B'
# class C():
#     # pass
#     a='C'
# class D(A,B,C):   #按括号中从左往右找
#     a='D'
#     # pass
# class E:
#     a='E'
# class F:
#     a='F'
# class G(A,B,C,D,E,F):
#     a='G'
# d=G()
# print(d.a)
# 继承的菱形问题(显示的继承第一个类,不是object类):
# 新式类和经典类的顺序不一样
# 形成一个圈就是菱形
# 新式类查找顺序:广度优先,左侧开始往上找,找到菱形定点(不包括顶点)结束
# 继续下一个继承的父类找到菱形顶点结束(不包括顶点)
# 经典类查找顺序:(只有python2中才有)深度优先,左侧开始往上找,找到菱形顶点结束,
# mro查找列表,只在新式类中有
# print(类名.mro()) = print(类名.__mro__)

继承重用父类的两种方式

# 继承重用父类方法一:指名道姓的使用
# 跟继承没有关系
# class A:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#
# class Person:
#     school='oldboy'   #减少了代码量
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def study(self):
#         print('study')
# class Teacher(Person):
#
#     def __init__(self,name,age,level):
#         A.__init__(self,name,age)
#         # self.name=name
#         # self.age=age
#         self.level=level
#
# class Student(Person):
#
#     def __init__(self,name,age,course):
#         # 重用父类的__init__方法
#         Person.__init__(self,name,age)
#         # self.name=name
#         # self.age=age
#         self.course=course
#     def study(self):
#         Person.study(self)
#         print(f'{self.name}正在学习')
# stu1=Student('wgj',20,'python')
# stu1.school='xxx'
# print(stu1.school)


# 继承重用父类方法二:super关键字
# super().__init__
# super(类名,对象).__init__  在py2中使用,py3中使用和上面一样
# class A:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age

# class Person:
#     school='oldboy'   #减少了代码量
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def study(self):
#         print('study')
# class Teacher(Person):
#
#     def __init__(self,name,age,level):
#         A.__init__(self,name,age)
#         # self.name=name
#         # self.age=age
#         self.level=level

# class Student(Person):

    # def __init__(self,name,age,course):
        # 重用父类的__init__方法
        # Person.__init__(self,name,age)
        # self.name=name
        # self.age=age
        # super().__init__(name,age)    #按照mro列表拿到父类对象
        # 对象来调用绑定方法,不需要传递第一个参数(self) 经典类,新式类
    #     super(Student,self).__init__(name,age)   #经典类必须写
    #     self.course=course
    # def study(self):
    #     Person.study(self)
    #     super().study()
#         print(f'{self.name}正在学习')
# stu1=Student('wgj',20,'python')
# stu1.school='xxx'
# print(stu1.school)

#
# class Student:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def study(self):
#         print(self.name)
#         print('study')
#     def change_name(obj,new_name):
#         print(f"原名{obj.name}")
#         obj.name=new_name
#         print(f"现名{new_name}")
# 类调用对象的绑定方法,(写在类中的函数,没加装饰器),有几个形参就传多少实参
# Student.__init__(123,'nick',18)
# 类实例化产生对象,会自动调用__init__完成初始化操作
# stu=Student('nick',18)
# 绑定方法会把对象本身当做self传入

# stu2=Student('tank',18)
# stu2.study()

# 修改学生姓名
# stu=Student('nick',18)
# 第一种
# print(stu.name)
# stu.name='tank'
# print(stu.name)
# 第二种
# stu.change_name('tank')
# print(stu.name)
# 第三种
# Student.change_name(stu,'tank')
# print(stu.name)
# 第四种
# 定义函数
# def change_name(obj,name):
#     obj.name=name
#     print(f"现名{name}")
# change_name(stu,'tank')



posted @ 2019-09-16 19:13  ZJJJJJJJ  阅读(190)  评论(0编辑  收藏  举报