1、文字描述 類屬性、實(shí)例屬性的區(qū)別。
類也是一種對(duì)象.
實(shí)例屬性只屬于當(dāng)前這一個(gè)實(shí)例對(duì)象的.self訪問(wèn)的都是實(shí)例屬性.
類是一種描述,類屬性是屬于每一個(gè)實(shí)例對(duì)象的,每一個(gè)對(duì)象都有類屬性.而且都是一樣的,只有一份.類屬性所有的實(shí)例方法都共享.如果對(duì)象也有同名的實(shí)例屬性,對(duì)象訪問(wèn)的時(shí)候,優(yōu)先使用實(shí)例屬性.其次才是類屬性.實(shí)例屬性會(huì)屏蔽掉同名的類屬性.
2、寫代碼創(chuàng)建類屬性和實(shí)例屬性并注釋指明是類屬性還是實(shí)例屬性
實(shí)例屬性:
class Person:
sun = 1
p1=Person()
p2=Person()
#獲取類屬性,每一個(gè)對(duì)象都有類屬性
print(p1.sun)
print(p2.sun)
print(Person.sun)
print('****************************************************************')
Person.sun=0
print(p1.sun)
print(p2.sun)
print(Person.sun)
類屬性:
class Person:
sun = 1
p1=Person()
p2=Person()
#獲取類屬性,每一個(gè)對(duì)象都有類屬性
print(p1.sun)
print(p2.sun)
print(Person.sun)
print('****************************************************************')
Person.sun=0
print(p1.sun)
print(p2.sun)
print(Person.sun)
print('****************************************************************')
#這里的sun是一個(gè)p1的實(shí)例屬性
p1.sun=1111
print(p1.sun)
#p2是類屬性
print(p2.sun)
print(Person.sun)
3、文字描述 類方法、實(shí)例方法、靜態(tài)方法的區(qū)別。
答:
類方法是類對(duì)象所擁有的方法,需要用修飾器@classmethod(注解、元數(shù)據(jù))來(lái)標(biāo)識(shí)其為類方法,對(duì)于類方法,第一個(gè)參數(shù)必須是類對(duì)象,一般以cls作為第一個(gè)參數(shù),能夠通過(guò)實(shí)例對(duì)象和類對(duì)象去訪問(wèn)。類方法還有一個(gè)用途就是可以對(duì)類屬性進(jìn)行修改.
用實(shí)例屬性調(diào)出來(lái)的方法就是實(shí)例方法.實(shí)例方法的第一個(gè)參數(shù)是實(shí)例對(duì)象self.
靜態(tài)方法? 需要通過(guò)修飾器@staticmethod來(lái)進(jìn)行修飾,靜態(tài)方法不需要多定義參數(shù).
總結(jié):
從類方法和實(shí)例方法以及靜態(tài)方法的定義形式就可以看出來(lái),類方法的第一個(gè)參數(shù)是類對(duì)象cls,那么通過(guò)cls引用的必定是類對(duì)象的屬性和方法;而實(shí)例方法的第一個(gè)參數(shù)是實(shí)例對(duì)象self,那么通過(guò)self引用的可能是類屬性、也有可能是實(shí)例屬性(這個(gè)需要具體分析),不過(guò)在存在相同名稱的類屬性和實(shí)例屬性的情況下,實(shí)例屬性優(yōu)先級(jí)更高。靜態(tài)方法中不需要額外定義參數(shù),因此在靜態(tài)方法中引用類屬性的話,必須通過(guò)類對(duì)象來(lái)引用.
4、寫代碼創(chuàng)建類方法、實(shí)例方法、靜態(tài)方法并注釋指明是類方法、實(shí)例方法、靜態(tài)方法
class Person:
def f1(self):
print('f1...self=%s,id(self)=%s'%(self,id(self)))
self.num=120? #實(shí)例方法
@classmethod
def f2(cls):? ? ? #類方法
print('f2...cls=%s,id(cls)=%s'%(cls,id(cls)))
cls.num=110? #類屬性
p1=Person()
p1.f1()
print(id(p1))
# Person.f1(p1)
print('****************************')
p1.f2()
print(id(Person))
Person.f2()
print(Person.num)
print('****************************')
print(p1.num)
print('****************************')
print('****************************')
p2 = Person()
print(p2.num)
print('****************************')
class Person:
@staticmethod? #靜態(tài)的
def f1():? ? #靜態(tài)方法
print('我是靜態(tài)的,不強(qiáng)制傳參')
p1 = Person()
p1.f1()
Person.f1()
print('****************************')
5、文字說(shuō)明,你對(duì)面向?qū)ο蟮睦斫狻?/p>
將數(shù)據(jù)與函數(shù)綁定到一起,進(jìn)行封裝,這樣能夠更快速的開發(fā)程序,減少了重復(fù)代碼的重寫過(guò)程.
按人們認(rèn)識(shí)客觀世界的系統(tǒng)思維方式,采用基于對(duì)象(實(shí)體) 的概念建立模型,模擬客觀世界分析、設(shè) 計(jì)、實(shí)現(xiàn)軟件的辦法。
面向?qū)ο笫且环N設(shè)計(jì)思想
1 符合人們的思考習(xí)慣
2 把執(zhí)行者變成指揮者
3 簡(jiǎn)化功能,把復(fù)雜的事情簡(jiǎn)單化
想完成一個(gè)事,找具有這樣功能的對(duì)象,如果能找到,調(diào)用這個(gè)對(duì)象的功能,完成這個(gè)事
如果找不到,創(chuàng)建具有這樣功能的對(duì)象,再調(diào)用完成這個(gè)事.
6、文字說(shuō)明面向?qū)ο蟮娜筇卣魇鞘裁??怎么理解?/p>
封裝? 繼承? ? 多態(tài)
封裝:類是一種封裝,將屬性和方法封裝。
函數(shù)也是一種封裝,將具有一定共的邏輯代碼封裝到一個(gè)函數(shù)中,使用的時(shí)候調(diào)用即可
提高代碼的擴(kuò)展性。
繼承:將共性的屬性和方法放在父類中,子類只需要關(guān)注自己特有的屬性和方法.提高代碼的擴(kuò)展性.
python中所有的內(nèi)容都是對(duì)象,所有的對(duì)象都直接或間接繼承了.雖然子類沒(méi)有定義__init__方法,但是父類有,所以在子類繼承父類的時(shí)候這個(gè)方法就被繼承了,所以只要?jiǎng)?chuàng)建Bosi的對(duì)象,就默認(rèn)執(zhí)行了那個(gè)繼承過(guò)來(lái)的__init__方法.子類在繼承的時(shí)候,在定義類時(shí),小括號(hào)()中為父類的名字父類的屬性、方法,會(huì)被繼承給子類.
多態(tài):
一個(gè)對(duì)象在不同的情況下,具有不同的形態(tài),用于強(qiáng)類型語(yǔ)言。是使用在繼承和接口中實(shí)現(xiàn)。
Python中有兩種說(shuō)法:
1、python支持多態(tài),python是一個(gè)弱類型,本身一個(gè)變量名,可以存儲(chǔ)任何類型的值,可以理解為多種形態(tài)
2、python不支持多態(tài),多態(tài)本身是用于強(qiáng)類型語(yǔ)言的,python是一個(gè)弱類型,所以不支持多態(tài)
Python不支持多態(tài),也不用支持多態(tài),python是一種多態(tài)語(yǔ)言,崇尚鴨子類型。