day23 繼承介紹 先抽象再繼承 在繼承背景下驗證對象的屬性查找 派生 在子類派生出的新方法中重用父類功能的方法一 在子類派生出的新方法中重用父類功能的方法二 經典類與新式類 菱形繼承 super(

面向對象的三大特性:繼承,封裝,多態java

一、什麼是繼承?python

  繼承是一種新建類的方式,在python中支持一個兒子繼承多個爹linux

  新建的類稱爲子類或者派生類sql

  類又能夠稱爲基類或者超類編程

  子類會遺傳父類的屬性json

二、爲何要用繼承微信

  減小代碼的冗餘app

三、怎麼用繼承函數

'''
class ParentClass1:
    pass

class ParentClass2:
    pass

class Subclass1(ParentClass1):
    pass

class Subclass2(ParentClass1,ParentClass2):
    pass

# print(Subclass1.__bases__)
print(Subclass2.__bases__)

# 在python2中有經典類與新式類之分
# 在python3中全都爲新式類

 尋找繼承關係學習

class OldboyPeople:
    school='oldboy'

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def f1(self):
        print('爹的f1')

class OldboyTeacher(OldboyPeople):
    def change_score(self):
        print('teacher %s is changing score'%self.name)

tea1=OldboyTeacher('egon',18,'male')
print(tea1.__dict__)
print(tea1.name)
print(tea1.school)
tea1.f1()

 基於繼承再找屬性關係

class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def f1(self):
        print('爹的f1')
class OldboyTeacher(OldboyPeople):
    def change_score(self):
        print('teacher %s is changing score' %self.name)

tea1 = OldboyTeacher('egon', 18, 'male')
# print(tea1.__dict__)
# print(tea1.name)
# print(tea1.school)
# print(tea1.change_score)
# print(tea1.f1)

class Foo:
    def f1(self):
        print('Foo.f1')

    def f2(self): #self=obj
        print('Foo.f2')
        self.f1() #obj.f1()

class Bar(Foo):
    def f1(self):
        print('Bar.f1')

obj=Bar()
# print(obj.__dict__)
obj.f2()

#基於對象本身的,再去找類的

派生

 子類定義本身新的屬性,若是與父類同名,以子類本身的爲準

# #派生:子類定義本身新的屬性,若是與父類同名,以子類本身的爲準
# class OldboyPeople:
#     school = 'oldboy'
#
#     def __init__(self, name, age, sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#
#     def f1(self):
#         print('爹的f1')
# class OldboyTeacher(OldboyPeople):
#     def change_score(self):
#         print('teacher %s is changing score' %self.name)
#
#     def f1(self):
#         print('兒子的f1')
#
# tea1 = OldboyTeacher('egon', 18, 'male')
# tea1.f1()
#
class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def f1(self):
        print('爹的f1')

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):
        self.name=name
        self.age=age
        self.sex=sex

        self.level=level
        self.salary=salary

    def change_score(self):
        print('teacher %s is changing score' %self.name)

    def f1(self):
        print('兒子的f1')

tea1 = OldboyTeacher('egon', 18, 'male',9,3.1)
print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)

#繼承能夠繼承父類特有的屬性,派生是能夠定製屬於本身的東西

在子類派生出的新方法中重用父類功能方法

# 在子類派生出的新方法中重用父類的功能
#方式一:指名道姓地調用(其實與繼承沒有什麼關係的)
# OldboyPeople.__init__(self,name, age, sex)

# class OldboyPeople:
#     school = 'oldboy'
#
#     def __init__(self, name, age, sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#
#     def tell_info(self):
#         print("""
#         ===========我的信息==========
#         姓名:%s
#         年齡:%s
#         性別:%s
#         """ %(self.name,self.age,self.sex))
#
# class OldboyTeacher(OldboyPeople):
#     #            tea1,'egon', 18, 'male', 9, 3.1
#     def __init__(self, name, age, sex, level, salary):
#         # self.name = name
#         # self.age = age
#         # self.sex = sex
#         OldboyPeople.__init__(self,name, age, sex)
#
#         self.level = level
#         self.salary = salary
#
#     def tell_info(self):
#         OldboyPeople.tell_info(self)
#         print("""
#         等級:%s
#         薪資:%s
#         """ %(self.level,self.salary))
#
# tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
# # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
#
# tea1.tell_info()

#方式二:super()調用(嚴格依賴於繼承)
#super()的返回值是一個特殊的對象,該對象專門用來調用父類中的屬性

#瞭解:在python2中,須要super(本身的類名,self)
class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def tell_info(self):
        print("""
        ===========我的信息==========
        姓名:%s
        年齡:%s
        性別:%s
        """ %(self.name,self.age,self.sex))

class OldboyTeacher(OldboyPeople):
    #            tea1,'egon', 18, 'male', 9, 3.1
    def __init__(self, name, age, sex, level, salary):
        # OldboyPeople.__init__(self,name, age, sex)
        super(OldboyTeacher,self).__init__(name,age,sex)

        self.level = level
        self.salary = salary

    def tell_info(self):
        # OldboyPeople.tell_info(self)
        super().tell_info()
        print("""
        等級:%s
        薪資:%s
        """ %(self.level,self.salary))

tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
# print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
tea1.tell_info()

經典類與新式類

# python2中分爲經典類與新式類  python3中只有新式類
'''
一、新式類:
    繼承object的類,以及該類的子類,都是新式類

    在python3中,若是一個類沒有指定繼承的父類,默認就繼承object
    因此說python3中全部的類都是新式類

二、經典類(只有在python2才區分經典類與新式類):
    沒有繼承object的類,以及該類的子類,都是經典類
'''
# print(object)

class Foo(object):
    pass

class Bar(Foo):
    pass

# print(Foo.__bases__)  #這條指令可以查看繼承的父類
print(Bar.__bases__)

菱形繼承(瞭解爲主)

super()對象嚴格依賴mro列表

 

週末做業

1.類的屬性和對象的屬性有什麼區別?

2.面向過程編程與面向對象編程的區別與應用場景?

4.什麼是綁定到對象的方法,如何定義,如何調用,給誰用?有什麼特性

5.以下示例,請用面向對象的形式優化一下代碼

  在沒有學習類這個概念時,數據與功能是分離的,以下

def exc1(host,port,db,charset):
conn=connect(host,port,db,charset)
conn.execute(sql)
return xxx
def exc2(host,port,db,charset,proc_name)
conn=connect(host,port,db,charset)
conn.call_proc(sql)
return xxx
# 每次調用都須要重複傳入一堆參數
exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
exc2('127.0.0.1',3306,'db1','utf8','存儲過程的名字')

六、下面這段代碼的輸出結果將是什麼?請解釋。

class Parent(object):
   x = 1

class Child1(Parent):
   pass

class Child2(Parent):
   pass

print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)   

七、定義學校類,實例化輸出:北京校區、上海校區兩個對象

  校區獨有的特性有:

    校區名=「xxx」

    校區地址={'city':"所在市","district":"所在的區"}

    多門課程=["xxx","yyy","zzz"]

    多個班級名=["xxx","yyy","zzz"]

  校區能夠:

    一、建立班級

    二、查看本校區開設的全部班級名

    三、建立課程

    四、查看本校區開設的全部課程名

八、定義出班級類,實例化出兩個班級對象

  班級對象獨有的特性:

    班級名="xxx"

    所屬校區名="xxx"

    多門課程名=["xxx","yyy","zzz"]

    多個講師名=["xxx","xxx","xxx"]

  班級能夠:

    一、查看

十一、定義講師類,實例化出egon,lqz,alex,wxx四名老師對象

  老師對象獨有的特徵:

    名字="xxx"

    等級="xxx"、

  老師能夠:

    修改學生的成績

十二、用面向對象的形式編寫一個老師類,老師有特徵:編號、姓名、性別、年齡、等級、工資,老師類中有功能

1三、按照定義老師的方式,再定義一個學生類

1四、抽象老師類與學生類獲得父類,用繼承的方式減小代碼冗餘

 

相關答案

"""
1.類的屬性和對象的屬性的區別:
    對象只屬於本身  能夠經過 對象名.屬性名來調用對象的屬性
    類能夠被該類全部的對象繼承,類能夠經過 類名.屬性名來調用對象的屬性

2.面向過程編程與面向對象編程的區別與應用場景?
    面向過程:
        考慮的是步驟,擴展性差 維護性差 可是化繁爲簡
        應用場景是 對擴展性要求不高的程序 好比:腳本程序等
    面向對象:
        考慮的是對象,擴展性強,維護性強,可是複雜,不可預知結果
        應用場景是 對擴展性要求高的程序 好比:qq 微信 遊戲等

3.什麼是綁定到對象的方法,、如何定義,如何調用,給誰用?有什麼特性
    方法:
        把對象和函數進行綁定
    定義:
        在類中定義函數
    調用:
        能夠用對象調用
        也能夠用類調用

    給對象用

    特性:
        在對象調用類中的方法時,默認會把對象傳入到方法中
        用類名調用方法的話,則須要手動傳入對象

"""

"""
五、以下示例, 請用面向對象的形式優化如下代碼# 在沒有學習類這個概念時,數據與功能是分離的, 以下
def exc1(host, port, db, charset,aaa):
    conn = connect(host, port, db, charset,aaa)
    conn.execute(sql)
    return xxx


def exc2(host, port, db, charset, proc_name)
    conn = connect(host, port, db, charset)
    conn.call_proc(sql)
    return xxx
    
exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
exc2('127.0.0.1',3306,'db1','utf8','存儲過程的名字')
"""

# class Mysql:
#     host = '127.0.0.1'
#     port = 3306
#     db = 'db1'
#     charset = 'utf8'
#
#     def exc1(self,sql):
#         conn = connect(self.host,self.port,self.db,self.charset)
#         conn.execute(sql)
#         return True
#
#     def exc2(self,host, port, db, charset, proc_name):
#         conn = connect(host, port, db, charset)
#         conn.call_proc(proc_name)
#         return True
#
# obj = Mysql()
# obj.exc1('select * from tb1;')
# obj.exc2('存儲過程的名稱')


# 六、下面這段代碼的輸出結果將是什麼?請解釋
# class Parent(object):
#    x = 1
#
# class Child1(Parent):
#    pass
#
# class Child2(Parent):
#    pass
# #
# print(Parent.x, Child1.x, Child2.x)       # 1 1 1
# #  先找子類 子類中沒有沿着繼承關係往父類找
#
# Child1.x = 2                              # Child1.x有了本身的x屬性 優先訪問本身的
# print(Parent.x, Child1.x, Child2.x)       # 1 2 1
#
# Parent.x = 3                              # 修改父類中的屬性
# print(Parent.x, Child1.x, Child2.x)       # 3 2 3
# # 子類Child1已經有屬於本身的屬性,即 x = 2,不會在繼承父類的屬性

"""
七、定義學校類,實例化出:北京校區、上海校區兩個對象
校區獨有的特徵有:
    校區名=「xxx」
    校區地址={'city':"所在市",'district':'所在的區'}
    多們課程名=['xxx','yyy','zzz']
    多個班級名=['xxx','yyy','zzz']
校區能夠:
    一、建立班級
    二、查看本校區開設的全部班級名
    三、建立課程
    四、查看本校區開設的全部課程名
"""
# class School:
#     def __init__(self, name, address, course, grade):
#         self.name = name
#         self.address = address
#         self.course = course
#         self.grade = grade
#
#     def make_grade(self, grade_name):
#         self.grade.append(grade_name)
#         print('%s班開課啦' % grade_name)
#
#
#     def check_grade(self):
#         print(self.grade)
#
#     def make_course(self, course_name):
#         self.course.append(course_name)
#         print('添加了%s課程' % course_name)
#
#     def check_course(self):
#         print(self.course)
#
# bj = School('北京校區',{'city':'北京','district':'朝陽區'},['python','linux','go'],['python1期','linux1期','go1期'])
# sh = School('上海校區',{'city':'上海','district':'浦東新區'},['python','linux','go'],['python1期','linux1期','go1期'])
# #
# bj.check_course()
# bj.check_grade()
# bj.make_grade('java1期')
# bj.make_course('java')
#
# bj.check_course()
# bj.check_grade()

"""
八、定義出班級類,實例化出兩個班級對象
    班級對象獨有的特徵:
        班級名=‘xxx’
        所屬校區名=‘xxx’
        多門課程名=['xxx','yyy','zzz']
        多個講師名=['xxx','xxx','xxx']

    班級能夠:
        一、查看本班全部的課程
        二、查看本班的任課老師姓名
"""

# class Grade:
#     def __init__(self,name,area_name,courses=[],teachers=[]):
#         self.name = name
#         self.area_name = area_name
#         self.courses = courses
#         self.teachers = teachers
#
#
#     def check_course(self):
#         print("%s班級 共開設%s個學科:" % (self.name,len(self.courses)))
#         print(self.courses)
#
#
#     def check_taacher(self):
#         print("%s班級 共有%s個任課老師:" % (self.name,len(self.teachers)))
#         print(self.teachers)
#
# py1 = Grade('python4期','上海校區',['python初級','python高級'],['egon','yang','zhang'])
# py2 = Grade('python5期','上海校區',['python初級','python高級','python進階'],['egon','yang','ji'])
# py1.check_course()
# py1.check_taacher()

"""
九、定義課程類,實例化出python、linux、go三門課程對象
課程對象獨有的特徵:
    課程名=‘xxx’
    週期=‘3mons’
    價格=3000

課程對象能夠:
    一、查看課程的詳細信息

"""
# class Course:
#     def __init__(self,name,month,price):
#         self.name = name
#         self.month = month
#         self.price = price
#
#     def check_grade(self):
#         print("名稱:%s 週期:%s 價格:%s" % (self.name,self.month,self.price))
#
# c1 = Course('python','3mons',3000)
# c2 = Course('linux','3mons',3400)
# c3 = Course('go','3mons',3500)
#
# c1.check_grade()
# c2.check_grade()
# c3.check_grade()

"""
十、定義學生類,實例化出張鐵蛋、王三炮兩名學生對象
    學生對象獨有的特徵:
        學號=10
        名字=」xxx「
        班級名=['xxx','yyy']
        分數=33
    
    學生能夠:
        一、選擇班級
        三、註冊,將對象序列化到文件
"""
import json
#
# # 要實現第一個要求 須要有一個班級李列表
# classes = ["python1期","go1期","python2期","java20期"]
# class Student:
#     def __init__(self, number, name, grade,class_names=[]):
#         self.number = number
#         self.name = name
#         self.class_names = class_names
#         self.grade = grade
#
#     #選課
#     def chioce_class(self):
#         print("班級列表:")
#         for i in classes:
#             print(i)
#         res = input("請選擇班級:").strip()
#         if res in self.class_names:
#             print("你已加入該班級...")
#         elif res in classes:
#             self.class_names.append(res)
#             print("加入成功!")
#         else:
#             print("輸入不正確....")
#
#     #序列化
#     def save(self):
#         dic = {'number': self.number, 'name': self.name, 'class_name': self.class_names, 'grade': self.grade}
#         with open(self.name, 'wt', encoding='utf-8')as f:
#             json.dump(dic, f)
#         print('save successful')
#
#
#
# stu1 = Student(10, '張鐵蛋', 'a3')
# stu2 = Student(10, '王三炮', 'a3')
#
# stu1.chioce_class()

# stu1.save()

"""
十一、定義講師類,實例化出egon,lqz,alex,wxx四名老師對象
    老師對象獨有的特徵:
        名字=「xxx」
        等級=「xxx」、
    老師能夠:
        一、修改學生的成績
"""
# class Teacher():
#     def __init__(self, name, level):
#         self.name = name
#         self.level = level
#
#     #經過名字 反序列化獲得學生對象 修改完成後在寫入到文件
#     def change(self, name, new_grade):
#         with open('%s' % name, 'rt', encoding='utf-8')as f:
#             dic = json.load(f)
#             dic['grade'] = new_grade
#             print(dic)
#         with open('%s' % name, 'wt', encoding='utf-8')as f:
#             json.dump(dic, f)
#             print("修改爲功!")
#
#
#
#
# tea1 = Teacher('egon', '高級')
# # tea2 = Teacher('lqz', '高級')
# # tea3 = Teacher('alex', '高級')
# # tea4 = Teacher('wxx', '高級')
# #
# tea1.change('張鐵蛋',90)

"""
十二、用面向對象的形式編寫一個老師類, 老師有特徵:編號、姓名、性別、年齡、等級、工資,老師類中有功能

一、生成老師惟一編號的功能,能夠用hashlib對當前時間加上老師的全部信息進行校驗獲得一個hash值來做爲老師的編號
    def create_id(self):
        pass
二、獲取老師全部信息
    def tell_info(self):
        pass
    
三、將老師對象序列化保存到文件裏,文件名即老師的編號,提示功能以下
    def save(self):
        with open('老師的編號','wb') as f:
        pickle.dump(self,f)

四、從文件夾中取出存儲老師對象的文件,而後反序列化出老師對象,提示功能以下
    def get_obj_by_id(id):
        return pickle.load(open(id,'rb'))

"""
from hashlib import md5
import pickle,time
# #
# class Teacher:
#     def __init__(self, name, gender, age, level, wages):
#         self.name = name
#         self.gender = gender
#         self.age = age
#         self.level = level
#         self.wages = wages
#         self.id = self.create_id()
#
#     def create_id(self):
#         md = md5(str(time.time()).encode("utf-8"))
#         return md.hexdigest()
#
#     def tell_info(self):
#         print("姓名:%s,性別:%s,年齡:%s,級別:%s,工資:%s,id:%s" %
#               (self.name,self.gender,self.age,self.level,self.wages,self.id))
#
#     def save(self):
#         with open(self.id, 'wb') as f:
#             pickle.dump(self, f)
#
#     @staticmethod
#     def get_obj_by_id(id):
#         return pickle.load(open(id, 'rb'))
#
# #序列化
# # t = Teacher("blex","男",20,"高級",3)
# # t.save()
#
# #反序列化
# t2 = Teacher.get_obj_by_id("59905193f41f1f658cd9f0c530a59ab7")
# t2.tell_info()



"""
1三、按照定義老師的方式,再定義一個學生類
"""
# class Student:
    # def __init__(self, name, gender, age, level, wages):
    #     self.name = name
    #     self.gender = gender
    #     self.age = age
    #     self.level = level
    #     self.wages = wages
    #     self.id = self.create_id()
    #
    # def create_id(self):
    #     md = md5(str(time.time()).encode("utf-8"))
    #     return md.hexdigest()
    #
    # def tell_info(self):
    #     print("姓名:%s,性別:%s,年齡:%s,級別:%s,工資:%s,id:%s" %
    #           (self.name,self.gender,self.age,self.level,self.wages,self.id))
    #
    # def save(self):
    #     with open(self.id, 'wb') as f:
    #         pickle.dump(self, f)
    #
    # @staticmethod
    # def get_obj_by_id(id):
    #     return pickle.load(open(id, 'rb'))

"""
1四、抽象老師類與學生類獲得父類,用繼承的方式減小代碼冗餘

"""
#
# from hashlib import md5
# import pickle,time

class BaseClass:
    def __init__(self, name, gender, age, level, wages):
        self.name = name
        self.gender = gender
        self.age = age
        self.level = level
        self.wages = wages
        self.id = self.create_id()

    def create_id(self):
        md = md5(str(time.time()).encode("utf-8"))
        return md.hexdigest()

    def tell_info(self):
        print("姓名:%s,性別:%s,年齡:%s,級別:%s,工資:%s,id:%s" %
              (self.name,self.gender,self.age,self.level,self.wages,self.id))

    def save(self):
        with open(self.id, 'wb') as f:
            pickle.dump(self, f)

    @staticmethod
    def get_obj_by_id(id):
        return pickle.load(open(id, 'rb'))
class Teacher(BaseClass):
    pass
class Student(BaseClass):
    pass

# #序列化
# t = Teacher("blex","男",20,"高級",3)
# t.save()
#
# #反序列化
t2 = Teacher.get_obj_by_id("ba0698c54af43dcbefbc42605902677a")
t2.tell_info()

  

  

七、定義學校類,實例化出:北京校區、上海校區兩個對象      校區獨有的特徵有:         校區名=「xxx」         校區地址={'city':"所在市",'district':'所在的區'}         多們課程名=['xxx','yyy','zzz']         多個班級名=['xxx','yyy','zzz']      校區能夠:         一、建立班級         二、查看本校區開設的全部班級名         三、建立課程         四、查看本校區開設的全部課程名   八、定義出班級類,實例化出兩個班級對象      班級對象獨有的特徵:         班級名=‘xxx’         所屬校區名=‘xxx’         多門課程名=['xxx','yyy','zzz']         多個講師名=['xxx','xxx','xxx']      班級能夠:         一、查看本班全部的課程         二、查看本班的任課老師姓名   九、定義課程類,實例化出python、linux、go三門課程對象      課程對象獨有的特徵:         課程名=‘xxx’         週期=‘3mons’         價格=3000      課程對象能夠:         一、查看課程的詳細信息   十、定義學生類,實例化出張鐵蛋、王三炮兩名學生對象      學生對象獨有的特徵:         學號=10         名字=」xxx「         班級名=['xxx','yyy']         分數=33      學生能夠:         一、選擇班級         三、註冊,將對象序列化到文件   十一、定義講師類,實例化出egon,lqz,alex,wxx四名老師對象      老師對象獨有的特徵:         名字=「xxx」         等級=「xxx」、      老師能夠:         一、修改學生的成績   十二、用面向對象的形式編寫一個老師類, 老師有特徵:編號、姓名、性別、年齡、等級、工資,老師類中有功能      一、生成老師惟一編號的功能,能夠用hashlib對當前時間加上老師的全部信息進行校驗獲得一個hash值來做爲老師的編號         def create_id(self):            pass      二、獲取老師全部信息         def tell_info(self):            pass      三、將老師對象序列化保存到文件裏,文件名即老師的編號,提示功能以下         def save(self):            with open('老師的編號','wb') as f:               pickle.dump(self,f)      四、從文件夾中取出存儲老師對象的文件,而後反序列化出老師對象,提示功能以下         def get_obj_by_id(self,id):            return pickle.load(open(id,'rb'))   1三、按照定義老師的方式,再定義一個學生類   1四、抽象老師類與學生類獲得父類,用繼承的方式減小代碼冗餘
相關文章
相關標籤/搜索