day23 01 类的命名空间
day23? 01 類的命名空間
一、初識(shí)面向?qū)ο髲?fù)習(xí)
定義類:
class
函數(shù):方法 動(dòng)態(tài)屬性
變量:類屬性 靜態(tài)屬性
過程:
(1)_init_方法:初始化:def _init_(self,參數(shù))
?
python幫我們創(chuàng)建了一個(gè)對(duì)象self
每當(dāng)我們調(diào)用類的時(shí)候就會(huì)自動(dòng)觸發(fā)這個(gè)方法
在_init_方法里面可以對(duì)self進(jìn)行賦值
self是什么:self擁有屬性都屬于對(duì)象
在類的內(nèi)部,self就是一個(gè)對(duì)象
比如:someone=person(),someone.walk==person.walk(someone),括號(hào)里面就是類里面的walk方法所傳的參數(shù)self,
? ? ? ? ? ? ?? 而且這個(gè)參數(shù)必須傳
(2)實(shí)例化:對(duì)象=類(參數(shù)是_init_方法的)
實(shí)例==對(duì)象 沒有區(qū)別
對(duì)象查看屬性:對(duì)象.屬性
對(duì)象調(diào)用方法:對(duì)象.方法名(參數(shù))==類名.方法名(對(duì)象名,參數(shù))
(3)實(shí)例:
求正方形的周長(zhǎng)和面積:
class square:def __init__(self,side_len):self.side_len_=side_lendef perimeter(self):return self.side_len_*4def area(self):return self.side_len_**2 s=square(6) print(s.perimeter()) print(s.area())運(yùn)行結(jié)果:
24 36為什么計(jì)算這個(gè)周長(zhǎng)和面積要使用類的調(diào)用和方法呢?
正方形不同的地方就是邊長(zhǎng)不一樣,不同的邊長(zhǎng)的正方形就歸為一類
有了固定的邊長(zhǎng),當(dāng)調(diào)用類里面的方法的時(shí)候就不需要再傳參數(shù)了:print(s.perimeter()) , print(s.area())都不需要再傳參數(shù)
何為python入門,面向?qū)ο笕腴T:
python 入門:當(dāng)你見到一個(gè)需求,你能翻譯成python語言
面向?qū)ο笕腴T:當(dāng)你見到一個(gè)需求,你能分析這個(gè)需求適不適合使用面向?qū)ο蠼鉀Q,如果適合,你能有一些想法
?
二、類和對(duì)象的命名空間
類里面可以定義兩種屬性:
靜態(tài)屬性:
動(dòng)態(tài)屬性:
定義一個(gè)類:一種課程course,屬性有:老師,課程名字,課程時(shí)間,課程費(fèi)用
class course:language='Chinese'def __init__(self,teacher,course_name,period,price):self.teacher=teacherself.course_name=course_nameself.period=periodself.price=pricedef func(self):pass python=course('李白','python','六個(gè)月','10000') print(python.teacher) print(python.course_name) print(python.period) print(python.price) course.language='English' #直接類名.靜態(tài)屬性是可以修改靜態(tài)屬性的 print(course.language) course.__dict__['language']='English' #但是使用類的字典形式去修改靜態(tài)屬性是不可能的,會(huì)報(bào)錯(cuò) print(course.language) print(python.language) #使用對(duì)象調(diào)用和查看類下的靜態(tài)屬性是可以的運(yùn)行結(jié)果:
Traceback (most recent call last): 李白File "<encoding error>", line 31, in <module> python TypeError: 'mappingproxy' object does not support item assignment 六個(gè)月 10000 Chinese English?
1、為什么對(duì)象可以直接調(diào)用查看類下的靜態(tài)屬性呢?
print(python.language)---可以且不會(huì)報(bào)錯(cuò)類下的命名空間有:language, _init_, func
對(duì)象self里面的命名空間有:teacher, course_name, period, price
類對(duì)象指針(內(nèi)存地址可以有對(duì)象的指向類的):可以根據(jù)對(duì)象屬性找到對(duì)應(yīng)的類,但是不能根據(jù)類找到對(duì)應(yīng)的對(duì)象屬性 python.language:首先會(huì)在python里面找,如果找不到就會(huì)向?qū)?yīng)的類中找,找到了就可以調(diào)用查看了 course.name:是找不到的
假設(shè)多加一門課程linux:
python=course('李白','python','六個(gè)月','10000') linux=course('秋白','linux','六個(gè)月','10000')
沒有改變類下的靜態(tài)屬性language,然后打印
print(python.language) print(linux.language)是都可以打印出來的,且都是Chinese,而當(dāng)通過
course.language='English'修改靜態(tài)屬性之后,再次打印
print(python.language) print(linux.language)結(jié)果也都會(huì)隨之改變,都會(huì)變成English,當(dāng)只通過對(duì)象修改類下的靜態(tài)屬性,在打印也是可以改的,如下:
python.language='English' print(python.language)?
2、對(duì)于不可變數(shù)據(jù)類下的類下屬性的操作
上面的 python.language='English', print(python.language)的改法實(shí)際上是在python對(duì)象下創(chuàng)建了一個(gè)新的language=‘English’,所以再python里面可以找得到,就不會(huì)繼續(xù)往類下面去找,在類下和linux下面(Linux指向的是類的命名空間)并沒有創(chuàng)建新的language,類下的language是不可變的數(shù)據(jù)類下,所以當(dāng)打印
print(linux.language) print(course.language)的結(jié)果還是原來的language的結(jié)果,即Chinese所以:
注意:對(duì)于不可變的數(shù)據(jù)類型來說,類變量最好使用類名操作
?
?3、對(duì)于可變的數(shù)據(jù)類型類下屬性的操作
比如前面的代碼中類下的屬性如果是: language=['Chinese'],然后按照下面進(jìn)行修改打印:
course.language[0]='English' print(course.language) print(linux.language) python.language[0]='English' print(python.language) print(course.language) print(linux.language)運(yùn)行結(jié)果:
['English']
['English']
['English']
['English']
['English']
此時(shí)通過對(duì)象名對(duì)類下的屬性進(jìn)行修改的時(shí)候就可以修改成功了,為什么呢?
(1)對(duì)于course.language[0]='English'的修改
類下的命名空間里面的language指向一個(gè)list的地址,而list的0元素指向的是Chinese的地址,當(dāng)你通過 course.language[0]='English'
去修改的時(shí)候,并沒有改變language指向list,對(duì)象指向類的命名空間的過程,所以最后都可以通過對(duì)象找得到改變的類下的屬性;
(2)對(duì)于python.language[0]='English'的修改
首先python對(duì)象先在自己的命名空間里面找一個(gè)可變的數(shù)據(jù)類型language,找不到就往類的命名空間里面找,因?yàn)閷?duì)象指向類的命名空間,并且可以找到可變的數(shù)據(jù)類型language,所以在做python里面的修改的時(shí)候,類下的也會(huì)隨之改變
?
注意:對(duì)于可變數(shù)據(jù)類型來說,通過對(duì)象名修改類下屬性是共享的,但是如果不是修改而是直接重新賦值的話是獨(dú)立的(類似于前面的不可變數(shù)據(jù)類型通過對(duì)象名對(duì)類下屬性是不能修改的)
?
4、創(chuàng)建一個(gè)類,每實(shí)例化一個(gè)對(duì)象就記錄下來,最終所有的對(duì)象都共享這個(gè)數(shù)據(jù)
比較簡(jiǎn)單的代碼:
?
class Foo:count=0def __init__(self):Foo.count+=1 #使用類名操作類下屬性,對(duì)象名調(diào)用類下屬性的時(shí)候,類下屬性會(huì)隨著操作的變化而變化 f1=Foo() f2=Foo() print(f1.count) print(f2.count)f3=Foo()
print(f1.count) #實(shí)例化f3,然后通過對(duì)象f1操作類下屬性,也是可以的,說明通過類名操作類下屬性的結(jié)果是共享的
?
運(yùn)行結(jié)果:
2 23
這樣就能滿足每次實(shí)例化的時(shí)候count就會(huì)加一
?
?
5、認(rèn)識(shí)綁定方法
?一個(gè)類也是可以沒有_init_方法的初始化的,只不過這樣每次實(shí)例化的時(shí)候創(chuàng)建對(duì)象字典里面就沒有任何值,是一個(gè)空的字典,代碼如下:
class Foo:def func(self):print('func') f1=Foo()運(yùn)行結(jié)果:為空
class Foo:def func(self):print('func') f1=Foo() print(Foo.func) print(f1.func) #這里的打印結(jié)果<bound method Foo.func of <__main__.Foo object at 0x0000016551112860>>會(huì)告訴我們一個(gè)綁定方法 print(f1)什么叫做綁定方法呢?
只有當(dāng)對(duì)象去調(diào)用類下的方法的時(shí)候,調(diào)用方法的時(shí)候必須傳入就是該對(duì)象,這樣對(duì)象與方法之間就產(chǎn)生了一種綁定的關(guān)系,如果用類名調(diào)用就不會(huì)產(chǎn)生這種綁定關(guān)系
先暫時(shí)了解一下,因?yàn)楹竺鏁?huì)講到類外一種非綁定的方法
?
6、包中的_init_
為什么我們每次導(dǎo)入一個(gè)包就會(huì)自動(dòng)調(diào)用執(zhí)行里面的_init_文件?
?
因?yàn)槊看螌?dǎo)入一個(gè)包 import package====類的實(shí)例化過程,包每次被導(dǎo)入就成為一個(gè)對(duì)象了,所以只要導(dǎo)入就可以使用里面的方法
比如:
import time
time.time
?
轉(zhuǎn)載于:https://www.cnblogs.com/wxm422562/p/10864928.html
總結(jié)
以上是生活随笔為你收集整理的day23 01 类的命名空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Prthon编码和解码/is 和 ==
- 下一篇: [Swift]最强UIButton解析