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