python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态
六、Python面向?qū)ο?-類與對象\封裝\繼承\(zhòng)多態(tài)
1、什么是面向?qū)ο缶幊?/p>
1.1 程序設(shè)計(jì)的范式:程序可控,易于理解
1.2 抽象并建立對象模型
1.3 程序是不同對象相互調(diào)用的邏輯。每個(gè)對象在代碼中抽象出來其實(shí)就是類;描述類特征的成為屬性;具體到某個(gè)類(獨(dú)立的類)則成為實(shí)例
2、類與對象
2.1 類:是多個(gè)類似事物的統(tǒng)稱。能夠幫助我們快速理解和判斷事物的性質(zhì)
2.2 數(shù)據(jù)類型:不同的數(shù)據(jù)類型屬于不同的類,使用內(nèi)置函數(shù)type()可以查看數(shù)據(jù)類型
2.3 對象: (eg)100、40、999都是int類下包含的相似的不同個(gè)例,這個(gè)個(gè)例專業(yè)術(shù)語稱為實(shí)例或?qū)ο?#xff0c;python中一切皆對象
2.4 類的創(chuàng)建
① 語法:通過class關(guān)鍵字定義一個(gè)類;類名以大寫字母開頭
② 類的組成:類屬性、實(shí)例方法、靜態(tài)方法、類方法
2.5 對象的創(chuàng)建
① 對象的創(chuàng)建又稱為類的實(shí)例化
② 語法:實(shí)例名 = 類名()
③ 意義:有了實(shí)例,就可以調(diào)用類中的內(nèi)容
2.6 類屬性、類方法、靜態(tài)方法
① 類屬性:類中方法外的變量稱為類屬性,被該類的所有對象所共享
② 類方法:[email?protected],使用類名直接訪問的方法
③ 靜態(tài)方法:[email?protected],使用類名直接訪問的方法
④ 一個(gè)例子
class Student: # Student 為類的名稱(類名)由一個(gè)或多個(gè)單詞組成,每個(gè)單詞的首字母大寫,其余小寫
native_pace = ‘吉林‘ # 直接寫在類里的變量,稱為類屬性
# 初始化方法
def __init__(self, name, age):
self.name = name # self.name 稱為實(shí)例屬性,進(jìn)行了一個(gè)賦值操作,將局部變量的name的值賦給實(shí)例屬性
self.age = age
# 實(shí)例方法
def eat(self): # 采用類名.方法名(類的對象)調(diào)用時(shí),需要傳入self
print(‘學(xué)生吃東西~~~~‘)
# 靜態(tài)方法:[email?protected]
@staticmethod
def method(): # 靜態(tài)方法中不允許寫self
print(‘這是靜態(tài)方法‘)
# 類方法:[email?protected]
@classmethod
def cm(cls): # 類方法中寫cls,采用類名.方法名(類的對象)調(diào)用的時(shí)候不需要傳入cls
print(‘這是類方法‘)
# 在類之內(nèi)定義的稱為方法,在類之外定義的稱為函數(shù)
def drink(): # 定義在類之外,叫做函數(shù)
print(‘喝水‘)
print(Student) # ==>
print(type(Student)) # ==>
print(id(Student)) # ==>1669260589880
# 創(chuàng)建Student類的對象:根據(jù)類對象創(chuàng)建出來的對象,叫做實(shí)例對象
stu1 = Student(‘張三‘, 20)
print(stu1)
print(type(stu1))
print(id(stu1))
# 對象調(diào)用類方法一,可以直接采用 對象名.方法名()
stu1.eat() # ==>學(xué)生吃東西~~~~
print(stu1.name) # ==>張三
print(stu1.age) # ==>20
# 對象調(diào)用類方法二
Student.eat(stu1) # 類名.方法名(類的對象)-->實(shí)際上就是方法定義出的self
# 類屬性的使用方式
print(Student.native_pace)
stu2 = Student(‘李四‘, 33)
print(stu1.native_pace)
print(stu2.native_pace)
Student.native_pace = ‘天津‘ # 修改類屬性后,訪問時(shí)所有值都改變
print(stu1.native_pace)
print(stu2.native_pace)
# 類方法的使用方式
Student.cm()
# 靜態(tài)方法的使用方式
Student.method()
2.7 動態(tài)綁定屬性和方法
① python是動態(tài)語言,在創(chuàng)建對象之后,可以動態(tài)地綁定屬性和方法
② 一個(gè)例子
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name + ‘在吃飯‘)
# 一個(gè)Student類可以創(chuàng)建多個(gè)Student的實(shí)例對象,每個(gè)實(shí)例對象可以相同也可以不同
stu1 = Student(‘張三‘, 20)
stu2 = Student(‘李四‘, 33)
# 為stu2動態(tài)綁定性別屬性,但是stu1不存在性別屬性
stu2.gender = ‘女‘
print(stu1.name, stu1.age)
print(stu2.name, stu2.age, stu2.gender)
# 為stu1單獨(dú)綁定一個(gè)動態(tài)函數(shù)
def show():
print(‘定義在類之外的,稱函數(shù)‘)
stu1.show = show # 動態(tài)綁定方法
stu1.show()
stu2.show() # stu2沒有綁定這個(gè)方法,所以執(zhí)行報(bào)錯(cuò)
3、面向?qū)ο笕筇卣?/p>
3.1 封裝:提高程序的安全性
① 將數(shù)據(jù)(屬性)和行為(方法)包裝到類對象中,在方法內(nèi)部對屬性進(jìn)行操作,在類對象的外部調(diào)用方法。這樣,無需關(guān)心方法內(nèi)部的具體實(shí)現(xiàn)細(xì)節(jié),從而隔離了復(fù)雜度
② 在python中沒有專門的修飾符用于屬性的私有,如果該屬性不希望在類對象外部被訪問,前面使用兩個(gè)‘_’.
③ 一個(gè)例子
class Student:
def __init__(self, name, age):
self.name = name
self.__age = age # 年齡不希望在類的外部被使用,所以加了兩個(gè)__
def show(self):
print(self.name, self.__age)
stu = Student(‘張三‘, 20)
stu.show()
# 在類的外部使用name和age
print(stu.name)
print(stu.__age) # 出現(xiàn)報(bào)錯(cuò),不能直接使用。AttributeError: ‘Student‘ object has no attribute ‘__age‘
print(dir(stu)) # 查看stu可以使用的全部屬性和方法
print(stu._Student__age) # 在類的外部訪問
3.2 繼承:提高代碼的復(fù)用性
① 語法
class 子類類名(父類1, 父類2, ...):
pass
② 如果一個(gè)類沒有繼承任何類,則默認(rèn)繼承object
③ python支持多繼承
④ 定義子類時(shí),必須在其構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù):新類不需要重頭編寫,子類只需要實(shí)現(xiàn)缺少的新功能,繼承父類所有的屬性、功能
class Person(object): # Person 繼承object類
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
class Teacher(Person):
def __init__(self, name, age, teach_year):
super().__init__(name, age)
self.teach_year = teach_year
stu = Student(‘張三‘, 20, ‘1001‘)
tea = Teacher(‘老師‘, 33, 10)
stu.info()
tea.info()
⑤ 函數(shù)isinstance()可以判斷一個(gè)變量的類型class Person(object)
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
p = Person(‘Tim‘, ‘Male‘)
s = Student(‘Bob‘, ‘Male‘, 88)
t = Teacher(‘Alice‘, ‘Female‘, ‘English‘)
# 在繼承鏈上,一個(gè)父類的實(shí)例不能是子類類型,因?yàn)樽宇惐雀割惗嗔艘恍傩院头椒?/p>
print(isinstance(p, Person)) # ==>True # p是Person類型
isinstance(p, Student) # ==>False # p不是Student類型
isinstance(p, Teacher) # ==>False # p不是Teacher類型
# 在一條繼承鏈上,一個(gè)實(shí)例可以看成它本身的類型,也可以看成它父類的類型
isinstance(s, Person) # ==>True # s是Person類型
isinstance(s, Student) # ==>True # s是Student類型
isinstance(s, Teacher) # ==>False # s不是Teacher類型
# isinstance也可以用于Python自有數(shù)據(jù)類型的判斷
s = ‘this is a string.‘
n = 10
isinstance(s, int) # ==> False
isinstance(n, str) # ==> False
3.3 多態(tài):提高程序的可擴(kuò)展性和可維護(hù)性
① 多態(tài)就是“具有多種形態(tài)”,即使不知道一個(gè)變量所引用的對象到底時(shí)什么類型,仍然可以通過這個(gè)變量調(diào)用方法,在運(yùn)行過程中根據(jù)變量所引用對象的類型,動態(tài)決定調(diào)用哪個(gè)對象中的方法
②
③
④
⑤
4、方法重寫
4.1 如果子類對繼承自父類的某個(gè)屬性或者方法不滿意,可以在子類中對其(方法體)進(jìn)行重新編寫
4.2 子類重寫后的方法中可以通過super().xxx()調(diào)用父類中被重寫的方法
4.3 一個(gè)例子
class Person(object): # Person 繼承object類
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
# 重寫父類中的info方法
def info(self):
super().info() # 會先執(zhí)行父類中的info方法
print(self.stu_no)
class Teacher(Person):
def __init__(self, name, age, teach_year):
super().__init__(name, age)
self.teach_year = teach_year
# 重寫父類中的info方法
def info(self):
super().info() # 會先執(zhí)行父類中的info方法
print(self.teach_year)
stu = Student(‘張三‘, 20, ‘1001‘)
tea = Teacher(‘老師‘, 33, 10)
stu.info()
tea.info()
5、object類
5.1 object類時(shí)所有類的父類,因此所有類都有object的屬性和方法
5.2 內(nèi)置函數(shù)dir()可以查看那指定對象的所有屬性
5.3 object類有一個(gè)__str__()方法,用于返回一個(gè)對于“對象的描述”,對應(yīng)于內(nèi)置函數(shù)str()經(jīng)常用于print()方法,幫助我們查看對象的信息,所以我們經(jīng)常會對__str__()重寫
class Student():
def __init__(self, name, age, stu_no):
self.name = name
self.age = age
self.stu_no = stu_no
def __str__(self):
return ‘我的名字是{}. 年齡是{}‘.format(self.name, self.age)
stu = Student(‘張三‘, 20, ‘1001‘)
print(stu) # 默認(rèn)會調(diào)用__str__()方法
print(type(stu))
原文:https://www.cnblogs.com/xuanling/p/14422786.html
總結(jié)
以上是生活随笔為你收集整理的python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 根据预览图片上传_JavaSc
- 下一篇: python找人,PythonOpenC