一.今日主要內容
1.成員
在類中你能寫的全部內容都是類的成員
2.變量
(1)實例變量:昨天寫的就是實例變量,由對象去訪問的變量.
(2)類變量(靜態變量):此時,這個變量屬於類,可是對象也能夠訪問
3.方法
(1)實例方法:昨天寫的就是實例方法,使用 對象.方法() 進行調用
特色:在聲明的時候,須要給出self,self必須放在第一個位置
在調用的時候,自動的會把對象傳遞給形參的self
(2)類方法(@classmethod):類方法是屬於類的.
特色:在聲明的時候須要給出一個可以接收類名的參數,cls,也必須放在參數的第一個
在調用的時候,自動的把xx對象的類傳遞給cls
(3) 靜態方法(@staticmethod):靜態方法也是屬於類的,靜態方法就比如,咱們在類中定義了一個函數
靜態方法通常和類方法差很少,使用類名去訪問
4.屬性(這個是比較有用的)
#爲了在難受的時候舒服一點
在方法上添加一個@property,能夠把一個方法變成一個屬性,可是這個屬性不能夠被賦值
當咱們某一個屬性必須通過計算才能獲得結果的時候
#個人理解:本質是方法,可是能夠當成屬性來用
5.私有
全部已雙下劃綫開頭的方法,變量都是私有內容,外界沒法訪問//除非你主動暴露這些內容
你想保護就把他私有化
#總結:強化面向對象(今天量稍微大一些)
二.今日內容大綱
1.實例化變量
2.實例方法
3.類變量
4.類方法
5.靜態方法
6.屬性
7.私有
三.今日內容詳解
1.實例變量
class Person: def __init__(self,name,id,gender,birth): self.name=name #實例變量 對象裏的變量 self.id=id self.gender=gender self.birth=birth p=Person('wusir','10086','不詳','1900-12-15') print(p.birth) p.birth='1840-5-6' #實例變量能夠進行修改 print(p.birth) #實例變量通常使用 對象.屬性 print(p.name)
2.實例方法
(1)
class Computer(object): #實例方法 def play(self): print('電腦能夠掃雷') #在定義實例方法的時候,必須給出一個參數 self #形參的第一個參數,自動的把對象給傳遞進來 def work(self): #self 就是個形參,隨便寫,中文也行 print(self) #self 是當前類的對象 print('電腦用來工做') c=Computer() c.work() #調用的時候不須要手動給出self print(c)
(2)函數
回顧以前
字符串操做. 列表操做. 字典操做. 元組操做.....
s = "你好啊"
s.replace("你", "我")
以前講解的全部方法都是實例方法
3.類變量
class Person: # country='中國' #類變量, 類變量是屬於類的 country = '大清' #類變量不是特別特別經常使用 def __init__(self,name,gender): self.name=name self.gender=gender p=Person('武sir','未知') print(p.name) #實例變量 print(p.gender) print(p.country) #類變量能夠給對象使用 p2=Person('太白','兩性') print(p2.gender) print(p2.country) #大坑:沒有修改類變量 p.country='大清' #沒有修改類變量,只是在本身的實例化空間內建立了一個country p2.country='大明' print(p.country) #類變量能夠給對象使用 print(p2.country) Person.country='大元' #類變量最好是使用類名來訪問 print(p.country) print(p2.country)
4.類方法測試
class Person: #實例方法 def chi(self): print('人會吃') @classmethod #裝飾器,此時這個方法是一個類方法,固定方法 def he(cls): #此時接收到的cls是類名 print(cls) print('人會喝') #用對象訪問 p=Person() p.he() #解釋:在調用類方法的時候. 默認的把類名傳遞給類方法 #<class '__main__.Person'> #人會喝 print(Person) #<class '__main__.Person'> # 類方法通常用類名去訪問 Person.he() # 類方法 # Person.chi() #這句話就會報錯 # 總結:帶類的最好用類來訪問
5.靜態方法spa
class Person: @staticmethod #靜態方法 def yue(): print('SKT') #靜態方法可使用對象訪問, # 也可使用類名訪問, # 可是通常推薦使用類名訪問 p=Person() p.yue() Person.yue() #知識點回顧: #fromkeys共用value,返回新字典,不是原來的字典
6.屬性code
(1)引子對象
#怎麼解決,每過一年都要加一年,把age 替換成 birth class Person: def __init__(self,name,gender,birth): self.name=name self.gender=gender self.birth=birth #2000 2018 #年齡這一項,原本就應該是算出來的,而不是直接存儲的 p1=Person('武sir','未知',2000) age=2018-p1.birth #每一個人都有年齡這個屬性,可是又沒辦法存儲 print(age)
(2)@propertyblog
class Person: def __init__(self,name,gender,birth): self.name=name self.gender=gender self.birth=birth #2000 2018 #年齡這一項,原本就應該是算出來的,而不是直接存儲的 @property #把一個方法更改爲一個屬性,每次拿屬性的時候都會自動的去執行這個方法 #方法的返回值就是屬性值 def age(self): #實例方法 print('我是方法') return 2018-self.birth #注意:這裏的屬性是不能賦值的,方法不是變量 p1=Person('武sir','未知',2000) print(p1.age) #看着像一個變量同樣使用,實際上這裏是調用的一個方法 print(p1.age) # p1.age=99 #不能夠修改的,由於age是一個方法,不是一個變量 #這句話修改會報錯
7.私有 __繼承
class Person: __qie='潘潘' #私有類變量(或者叫作私有靜態變量) def __init__(self,name,mimi): self.name=name self.__mimi=mimi #__mimi表明的是 私有內容 實例變量 def gaosu(self): print(f'把祕密告訴了太白,次日全部人都知道了"{self.__mimi}"') print(Person.__qie) #私有的類變量只能在類中調用,能夠用類名調用 print(self.__qie) #私有的類變量只能在類中調用,能夠用對象名調用 def __yue(self): #私有的實例方法 print('我要和寶寶約') @staticmethod def __koujiao(): print('韓志遠但願和嫂子一塊兒摳腳') p=Person('wusir','和嫂子的故事') p.gaosu() # print(p.__mimi) #私有的內容只能在類裏面調用,這裏寫會報錯 #除非主動暴露本身的祕密,不然,不會 # print(Person.__qie) #這句話也會報錯 # p.__koujiao() #也會報錯 # Person.__koujiao() #也會報錯
做業:字符串
1. 簡述⾯面向對象三⼤大特性並⽤用示例例解釋說明?【背寫】 get
封裝:對屬性和方法的封裝,以便隨時調用
繼承:子類除了自己以外還可使用父類的方法和屬性
多態:鴨子模型,同一個對象擁有多種形態
2.⾯向對象中的變量分爲哪幾種?並用示例說明區別?【背寫】it
(1)實例變量: 說白了,就是每一個實例變量都應該擁有的變量,好比,人的名字,人的愛好
每一個人的我的信息都屬於實例變量..給對象用的
(2) 類變量(靜態變量): 直接寫在類中的變量就是類變量,須要用類名來訪問,能夠改變,多個對象共享的
3.⾯向對象中方法有哪幾種?並用示例說明區別?【背寫】
1. 類方法 類名.方法 調用
2. 實例方法 對象.方法 調用
3. 靜態方法 類名.方法 調用
4.面向對象中的屬性有什麼?並⽤用示例例說明?
重點記憶(這個 沒有理解好)
(1)@property 把方法轉換成屬性
(2)對象.屬性(self.name)
5.簡述靜態方法和類方法的區別?
記憶!!!
靜態方法: 不用傳遞參數,沒有繼承
類方法: 須要傳遞參數,能夠繼承;訪問類方法,默認傳遞的是類;
6.⾯向對象的⽅法中哪一個無需傳參數?
記憶!!!
靜態方法
7.面向對象中公有和私有成員,在編寫和調用時有哪些不一樣?
記憶!!!
編寫,公有成員編寫時,沒有什麼特別的要求,私有成員在成員名字前面須要加上__,雙下劃線,
公有成員在內部和外部均可以調用,私有成員只能在內部使用
網友:
公有使用: __xx__ 兩端使用__
私有使用__xx 左端使用
8.
class Foo(object): a1=11 a2=12 def __init__(self): self.a1=1 obj=Foo() print(obj.a1) print(obj.a2) 結果: 1 12 分析:應該先找__init__裏面的實例變量信息,再找類變量信息
9.
class Foo(object): a1=11 def __init__(self,num): # self.a2=num self.a2=1 obj=Foo(999) print(obj.a2) print(obj.a1) print(Foo.a1) # print(Foo.a2) #由於第四行裏是用類調用初始化方法裏的變量,天然調用不到 #報錯緣由是,類中沒有屬性a2 結果: 999 11 11 第四行報錯
10.
class Foo(object): a1=1 __a2=2 a2=2 def __init__(self,num): self.num=num self.__salary=1000 # self.salary=1000 def get_data(self): print(self.num+self.a1) obj=Foo(666) print(obj.num) print(obj.a1) # print(obj.__salary) #結果:Foo' object has no attribute '__salary' # print(obj.salary) #本身測試結果:1000 # print(obj.__a2) # print(obj.a2) #本身測試結果:2 print(Foo.a1) #結果:1 print(Foo.__a2) # print(Foo.a2) #本身測試結果:2 結果: 666 1 找不到 找不到 1 找不到
11.
# 沒問題,可是作這樣的題目必定要仔細 class Foo(object): a1=1 __a2=2 def __init__(self,num): self.num=num self.__salary=1000 def get_data(self): print(self.num+self.a1) obj1=Foo(666) obj2=Foo(999) print(obj1.num) #666 print(obj1.a1) #1 obj1.num=18 obj1.a1=99 print(obj1.num) #18 print(obj1.a1) #99 print(obj2.a1) #1 print(obj2.num+Foo.a1) #1000 print(obj2.num+obj1.a1) #1098
12.
#注意下面的四種玩法 class Foo(object): hobby='大保健' def __init__(self,num): self.num=num self.__salary=1000 def f1(self): print(Foo.hobby) @staticmethod # def f2(self): def f2(): #注意這個靜態方法不能有self,有self不會調用 print(Foo.hobby) @classmethod def f3(cls): print(cls.hobby) @property def f4(self): print(Foo.hobby) # print(self.hobby) f=Foo(200) f.f1() f.f2() f.f3() f.f4
13.
class Foo(object): @classmethod def f3(cls): print(cls) Foo.f3() #結果:<class '__main__.Foo'>
14.
class Foo(object): @classmethod def f3(cls): print(cls) obj=Foo() obj.f3() #結果:<class '__main__.Foo'>
15.
#我認爲是同樣的 #結果是同樣的,和我推測的同樣 class Foo(object): @classmethod def f3(cls): print(cls) def f2(self): self.f3() #<class '__main__.Foo'> Foo.f3() #<class '__main__.Foo'> obj=Foo() obj.f2()
16.
class Base(object): @classmethod def f3(cls): print(cls) def f1(self): print('base.f1') self.f3() #子類中有的話,用子類的,沒有則用父類的 class Foo(Base): # def f3(self): # print('123') def f2(self): print('foo.f2') self.f1() obj=Foo() obj.f2() #結果: foo.f2 base.f1 <class '__main__.Foo'>
17.請編寫一個私有的靜態方法,並經過代碼證實私有方法不能再外部方法但能夠在內部訪問。
#注意,咱們能夠在內部經過,本身的類和未私有化的方法來調用私有化的靜態方法 class Person: __qie='潘潘' #私有類變量 def __init__(self,name,mimi): self.name=name self.__mimi=mimi #__mimi表明的是 私有方法 # @staticmethod def __donggua(self): # def donggua(self): print('你好啊!') def gaosu(self): # __donggua() Person.__donggua(self) print(f'把祕密告訴了太白,次日全部人都知道了"{self.__mimi}"') p=Person('wusir','和嫂子的故事') # print(p.__mimi) #私有的內容只能在類裏面調用 #除非主動暴露本身的祕密,不然,不會 p.gaosu()