#面向對象的幾個方法
#1.靜態方法@staticmethod,不能訪問類屬性,也不能訪問實例屬性,只是類的工具包
#2.類方法:@classmethod,在函數屬性前加上類方法,顯示為(cls)代表類,類能訪問到數據屬性和函數屬性,不能訪問至實例屬性
#3.靜態屬性:@property,把函數封裝成一個數據屬性的形式,讓外部調用時看不到內部的邏輯;特點:定義時有self(實例本身)
#################################################################################################################
#組合(拼接):定義一個人的類,比如手、頭、腳,這個屬性又可以是通過一個實例化的對象,這就是組合
#用途:1.做關聯、2.小的組成大的
# class Head:
# pass
# class Foot:
# pass
# class Trunk:
# pass
# class Hand:
# pass
# class Person:
# def __init__(self,id_num,head,foot,trunk,hand):
# self.id_num = id_num
# self.head = head()
# self.foot = foot()
# self.trunk = trunk()
# self.hand = hand()
# P1 = Person.__dict__
# print(P1)
# F:\Python\PythonLeaning\venv\Scripts\python.exe F:/Python/PythonLeaning/每日學習打卡/Day25.py
# {'__module__': '__main__', '__init__': <function Person.__init__ at 0x000000000297A6A8>,
# '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__':
# <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
#
# Process finished with exit code 0
#################################################################################################################
# class School:
# def __init__(self,name,addr):
# self.name = name
# self.addr = addr
#
# class Course:
# def __init__(self,name,price,period,school):
# self.name = name
# self.price = price
# self.period = period
# self.school = school
# def employ(self):
# print('%s 正在empoying'%self.name)
# s1 = School('oldboy','beijing')
# s2 = School('oldboy','nanjing')
# s3 = School('oldboy','dongjing')
# c1 = Course('linux',10,'1h',s1)
# c2 = Course('Python',100,'100h',s2)
# msg = '''
# 1 oldboy beijing
# 2 oldboy nanjing
# 3 oldboy dongjing
# '''
# while True:
# print(msg)
# menu = {
# '1':s1,
# '2':s2,
# '3':s3
# }
# choice = input('選擇學校>>>')
# school_obj = menu[choice]
# # choice2 = input('選擇課程>>>')
# name = input('課程名>>: ')
# price = input('課程費用>>: ')
# period = input('課程周期>>: ')
# new_course = Course(name, price, period, school_obj)
# print('課程【%s】屬于【%s】學校' % (new_course.name, new_course.school.name))
# 模擬選課##############################################################################################
#################################################################################################################
#################################################################################################################
# 面向對象的三大特性
# 1.繼承 2.多態 3.封裝
# 一、什么是類的繼承?
# 類的繼承跟現實中的父子、孫子、重孫子、繼承關系一樣,父類又稱為基類
# python中的類的繼承分為:單繼承和多繼承
# class ParentClass1:
# pass
# class ParentClass2:
# pass
# class SubClass(ParentClass1): #單繼承
# pass
# class SubClass(ParentClass1,ParentClass2): #多繼承
# pass
# 二、子類到底繼承了父類的什么屬性
# 子類調用方法會觸發父類的init方法,子類繼承了父類的所有屬性,但是子類的方法還是先調用自己的方法,找不到自己的方法才會去
# 父類去找方法或屬性
# class robot:
# power = 100
# def __init__(self,name,energy):
# self.name = name
# self.energy = energy
# def act(self):
# print('%s機器人正在消耗能源'%self.name)
# class robot_arm(robot):
# def __init__(self,type):
# self.type = type
# def act1(self):
# print('%s型號機器人正在動arm'%self.type)
# r = robot('pandaboy','氫氣能源')
# r1 = robot_arm('ASII')
# r1.act1()
# print(r1.power)
#################################################################################################################
# F:\Python\PythonLeaning\venv\Scripts\python.exe F:/Python/PythonLeaning/每日學習打卡/Day25.py
# ASII型號機器人正在動arm
# 100
#
# Process finished with exit code 0
#################################################################################################################
#################################################################################################################
# 什么時候用繼承?
# 1.當類之間有顯著不同,并且較小的類是較大的類所需要的組件,用組合比較好
# 例如:描述一個機器人類,機器人這個大類是由很多互不相關的小類組成的,如機器手臂類、身體類、電池類等
# 2.當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好
#################################################################################################################
# 什么是派生?
# 當然子類也可以添加自己新的屬性或者在自己這里重新定義這些屬性(不會影響到父類),需要注意的是,
# 一旦重新定義了自己的屬性且與父類重名,那么調用新增的屬性時,就以自己為準了。
#################################################################################################################
# 繼承同時具有兩種含義
# 含義一:繼承基類的方法,并且自己的改變或者擴展(代碼重用)
# 含義二:聲明某個子類兼容于某基類,定義一個借口類,子類繼承接口類,并且實現接口中定義的方法
# 實踐中,繼承的第一種含義意義并不是很大,甚至是有害的,因為它使得子類與基類出現強耦合
# 繼承的第二種含義非常重要,它又叫"接口繼承"
# 接口繼承實質上是要求"做出一個良好的抽象,這個抽象規定了一個兼容接口,使得外部調用者無需關心具體細節,可以一視同仁
# 的處理實現特定接口的所有對象——這在程序設計上叫做歸一化"
# 歸一化使得高層的外部使用者可以不加區分的處理所有接口兼容的對象集合——就好像linux的泛文件對象概念一樣,
# 所有的東西都可以當做文件處理,不必關心它是內存、磁盤、網絡還是屏幕(當然,對于底層設計者,也可以區分出"字符設備"和"塊設備")
# 然后做出針對性的設計,細致到什么程度,視需求而定
# 一切皆文件是沒有意義的,歸根結底就是全部都是讀和寫
#################################################################################################################
# 接口繼承代表定義一個基類,類當中把接口的方法定義一個函數,來一個子類就必須實現基類的方法
# 接口就是一個函數
# import abc
# 1.python可以繼承多個類,java和c只能繼承一個類
# 2.python如果繼承了多個類,那么尋找方法的方式有兩種,分別是深度優先和廣度優先
# 當類是經典類時,多繼承情況下,會按照深度優先方式查找
# 當類時新式類時,多繼承情況下,會按照廣度優先方式查找
#————————————————————————————————————————————————————————
# 繼承順序
# class A:
# pass
# class B(A):
# pass
# class C(A):
# pass
# 在子類中繼承父類
# super().__init__()
# 運行super調用super下的方法
轉載于:https://www.cnblogs.com/pandaboy1123/p/8485838.html