-
這是一段Python代碼,它定義了幾個(gè)類和它們的方法。以下是對(duì)每個(gè)類和函數(shù)的詳細(xì)解釋:
person類:這是一個(gè)基礎(chǔ)類,用于表示一個(gè)人。它有一個(gè)初始化方法__init__,該方法接受一個(gè)參數(shù)name,并將其賦值給類的name屬性。
python
復(fù)制
class person():
? ? def __init__(self, name):
? ? ? ? self.name = name
skillMixin類:這是一個(gè)混合類(Mixin),用于添加技能相關(guān)的功能。它也有一個(gè)初始化方法__init__,接受一個(gè)參數(shù)skil,并將其賦值給類的skill屬性。
python
復(fù)制
class skillMixin():
? ? def __init__(self, skil):
? ? ? ? self.skill = skil
basketballMixin類:這是一個(gè)繼承自skillMixin的類,專門用于表示籃球技能。它重寫了父類的skill方法,打印出字符串'basketball'。
python
復(fù)制
class basketballMixin(skillMixin):
? ? def skill(self):
? ? ? ? print('basketball')
student類:這是一個(gè)繼承自person的類,用于表示學(xué)生。它重寫了父類的初始化方法__init__,以確保調(diào)用父類的初始化方法。
python
復(fù)制
class student(person):
? ? def __init__(self, name):
? ? ? ? super(student, self).__init__(name)
Bstudent類:這是一個(gè)同時(shí)繼承自basketballMixin和student的類,用于表示會(huì)打籃球的學(xué)生。它沒有定義額外的方法或?qū)傩?,因此它繼承了其父類的所有功能。
python
復(fù)制
class Bstudent(basketballMixin, student):
? ? pass
在代碼的末尾,注釋掉的部分創(chuàng)建了一個(gè)Bstudent類的實(shí)例s,并嘗試調(diào)用它的skil()方法(應(yīng)該是skill()方法)。如果取消注釋,這段代碼會(huì)創(chuàng)建一個(gè)學(xué)生實(shí)例,并打印出'basketball',因?yàn)锽student類繼承了basketballMixin類的skill方法。
總結(jié)來說,這段代碼展示了Python中類和混合類的定義,以及如何通過繼承來組合不同的類和功能。
查看全部 -
代碼定義了一個(gè)名為Person的類,它使用__slots__屬性來限制可以動(dòng)態(tài)添加的實(shí)例屬性。在這個(gè)例子中,Person類只有兩個(gè)屬性:name和gender。__init__方法是構(gòu)造方法,用于初始化這些屬性。
接著,代碼定義了一個(gè)名為Student的類,它繼承自Person類。Student類同樣使用__slots__來限制實(shí)例屬性,這里添加了一個(gè)額外的屬性score。Student類的__init__方法不僅初始化了從Person類繼承來的name和gender屬性,還初始化了score屬性。
在代碼的最后,創(chuàng)建了一個(gè)Student類的實(shí)例s,并給它的name屬性賦值為'Tim',score屬性賦值為99。然后,通過s.score打印出實(shí)例s的score屬性值。
這是一個(gè)面向?qū)ο缶幊痰睦樱故玖祟惖睦^承和實(shí)例化,以及如何通過實(shí)例來訪問類中定義的屬性。
查看全部 -
int()函數(shù)可以把字符串轉(zhuǎn)換為整數(shù),當(dāng)僅傳入字符串時(shí),int()函數(shù)默認(rèn)按十進(jìn)制轉(zhuǎn)換;int()函數(shù)還提供額外的base參數(shù),如果傳入base參數(shù),就可以做 N 進(jìn)制的轉(zhuǎn)換。
>>>?int('12345',?base=8) 5349
functools.partial就是幫助我們創(chuàng)建一個(gè)偏函數(shù)的,不需要我們自己定義int2(),可以直接使用下面的代碼創(chuàng)建一個(gè)新的函數(shù)int2:
>>>?import?functools >>>?int2?=?functools.partial(int,?base=2) >>>?int2('1000000') 64
查看全部 -
@log('DEBUG') def?my_func(): ????pass
my_func?=?log('DEBUG')(my_func)
log_decorator?=?log('DEBUG') my_func?=?log_decorator(my_func)
log_decorator?=?log('DEBUG') @log_decorator def?my_func(): ????pass
帶參數(shù)的log函數(shù)首先返回一個(gè)decorator函數(shù),再讓這個(gè)decorator函數(shù)接收my_func并返回新函數(shù),相當(dāng)于是在原有的二層嵌套里面,增加了一層嵌套.
def?log(prefix): ????def?log_decorator(f): ????????def?wrapper(*args,?**kw): ????????????print('[{}]?{}()...'.format(prefix,?f.__name__)) ????????????return?f(*args,?**kw) ????????return?wrapper ????return?log_decorator @log('DEBUG') def?test(): ????pass test()
查看全部 -
Python的 decorator 本質(zhì)上就是一個(gè)高階函數(shù),它接收一個(gè)函數(shù)作為參數(shù),然后,返回一個(gè)新函數(shù)。
使用 decorator 用Python提供的 @ 語法,這樣可以避免手動(dòng)編寫 f = decorate(f) 這樣的代碼。
要讓 @log 自適應(yīng)任何參數(shù)定義的函數(shù),可以利用Python的?args 和 *kwargs,保證任意個(gè)數(shù)的參數(shù)總是能正常調(diào)用.
def?log(f): ????def?fn(*args,?**kwargs): ????????print('call?'?+?f.__name__?+?'()...') ????????return?f(*args,?**kwargs) ????return?fn
@log def?factorial(n): ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1)) print(factorial(10))
查看全部 -
內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量),然后返回內(nèi)層函數(shù)的情況,稱為閉包(Closure)。
閉包的特點(diǎn)是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變。
def?calc_sum(list_): ????def?lazy_sum(): ????????return?sum(list_) ????return?lazy_sum
查看全部 -
返回函數(shù)和返回函數(shù)值的語句是非常類似的,返回函數(shù)時(shí),不能帶小括號(hào),而返回函數(shù)值時(shí),則需要帶上小括號(hào)以調(diào)用函數(shù)。
#?返回函數(shù) def?myabs(): ????return?abs #?返回函數(shù)值 def?myabs(x): ????return?abs(x)
查看全部 -
需要指定排序的字段是成績(jī),sorted接受key參數(shù),用來指定排序的字段,key的值是一個(gè)函數(shù),接受待排序列表的元素作為參數(shù),并返回對(duì)應(yīng)需要排序的字段。
def?k(item): ????return?item[1]?#?==>?按成績(jī)排序,成績(jī)是第二個(gè)字段 sorted(score,?key=k)
查看全部 -
filter()函數(shù)是 Python 內(nèi)置的另一個(gè)有用的高階函數(shù),filter()函數(shù)接收一個(gè)函數(shù) f 和一個(gè)list,這個(gè)函數(shù) f 的作用是對(duì)每個(gè)元素進(jìn)行判斷,返回 True或 False,filter()根據(jù)判斷結(jié)果自動(dòng)過濾掉不符合條件的元素,并返回一個(gè)迭代器,可以迭代出所有符合條件的元素。
def?is_odd(x): ????return?x?%?2?==?1 for?item?in?filter(is_odd,?[1,?4,?6,?7,?9,?12,?17]): ????print(item)
查看全部 -
reduce()函數(shù)接收的參數(shù)和 map() 類似,一個(gè)函數(shù) f,一個(gè)list,但行為和 map()不同,reduce()傳入的函數(shù) f 必須接收兩個(gè)參數(shù),reduce()對(duì)list的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。
查看全部 -
俺嫂子在[]
-——嘖-啊嘖(--“”。在。![]查看全部 -
map()是 Python 內(nèi)置的高階函數(shù),它接收一個(gè)函數(shù) f?和一個(gè) list,并通過把函數(shù) f依次作用在list的每個(gè)元素上,map()函數(shù)會(huì)返回一個(gè)迭代器,可以依次迭代得到原來list的元素被函數(shù)f處理后的結(jié)果。
map(f,?list)
查看全部 -
在Python中,使用套接字socket來建立起網(wǎng)絡(luò)連接。
服務(wù)端建立需要四個(gè)步驟:新建socket、綁定IP和端口(bind)、監(jiān)聽連接(listen)、接受連接(accept)。
客戶端僅需兩個(gè)步驟:新建socket、連接服務(wù)端(connect)。
當(dāng)網(wǎng)絡(luò)連接上以后,客戶端和服務(wù)端就可以進(jìn)行數(shù)據(jù)通信了,套接字通過send()函數(shù)發(fā)送數(shù)據(jù),通過recv()函數(shù)接收數(shù)據(jù)。
import?socket server?=?socket.socket()?#?1.?新建socket server.bind(('127.0.0.1',?8999))?#?2.?綁定IP和端口(其中127.0.0.1為本機(jī)回環(huán)IP) server.listen(5)?#?3.?監(jiān)聽連接 s,?addr?=?server.accept()?#?4.?接受連接 print('connect?addr:{}'.format(addr)) content?=s.recv(1024) print(str(content,?encoding='utf-8'))??#?接受來自客戶端的消息,并編碼打印出來 s.close()
import?socket client?=?socket.socket()?#?1.?新建socket client.connect(('127.0.0.1',?8999))?#?2.?連接服務(wù)端(注意,IP和端口要和服務(wù)端一致) client.send(bytes('Hello?World.?Hello?Socket',?encoding='utf-8'))?#?發(fā)送內(nèi)容,注意發(fā)送的是字節(jié)字符串。 client.close()
python?server.py python?client.py
查看全部 -
seek()方法,可以移動(dòng)文件的游標(biāo)位置,它接受一個(gè)參數(shù),表示文件的位置,0:文件首部,1:當(dāng)前位置,2:文件尾部,通過seek()可以把文件游標(biāo)移動(dòng)到文件首部但不刪除文件的內(nèi)容。
查看全部 -
從模塊中導(dǎo)入函數(shù)并將其重命名:
from?...?import?as?... from?math?import?pow?as?mathpow
查看全部 -
__slots__的目的是限制當(dāng)前類所能擁有的屬性.
class?Person(object): ????def?__init__(self,name): ????????self.name?=?name p?=?Person('lily') p.age?=?12 class?Student(object): ????__slots__?=?('name','gender') ????def?__init__(self,name,gender): ????????self.name?=?name ????????self.gender s?=?Student('Tom','Male') s.age?=?10??? print(s.age)???#會(huì)出錯(cuò)
查看全部 -
dir()返回的是屬性是字符串列表;
通過getattr()和setattr()來獲取或設(shè)置對(duì)象屬性;
通過type()獲得變量類型。
i?=?10???type(i) dir(i) class?Person(object): ????def?__init__(self,name,age,**kwargs): ????????self.name?=?name ????????self.age?=?age ????????for?k,v?in?kwargs.items(): ????????????setattr(self,k,v)
查看全部 -
多重繼承,初始化方法只調(diào)用一次;
多重繼承的目的是從多種繼承樹選擇并繼承出子類,以便組合功能使用。
class?D(object): ????pass class?A(D): ????pass class?MK(object): ????pass class?Ck(MK): ????pass class?Ack(A,Ck): ????pass
查看全部 -
定義繼承類:
????????1.定義子類,在括號(hào)里寫明要繼承的父類;
????????2.初始化方法,需要調(diào)用super(子類,self).__init__(繼承的屬性).
class?Person(object): ????def?__init__(self,name,gender): ????????self.name?=?name ????????self.gender?=?gender class?Teacher(Person): ????def?__init__(self,name,gender,subject): ????????super(Teacher,self).__init__(name,gender) ????????self.subject?=?subject
查看全部 -
1.類方法需要使用@classmethod來標(biāo)記為類方法,否則定義的還是實(shí)例方法;
2.類方法的第一個(gè)參數(shù)將傳入類本身,通常將參數(shù)名命名為 cls.
class?Animal(object): ????__count?=?0 ????def?__init__(self,name,age): ????????self.name?=?name ????????self.age?=?age ????????Animal.__count?+=?1 ????@classmethod ????def?get_count(cls): ????????return?cls.__count
查看全部 -
訪問私有屬性,可通過類中定義實(shí)例方法。
class?Animal(object): ????def?__init__(self,name,age,location): ????????self.__name?=?name ????????self.__age?=?age ????????self.__location?=?location ????def?get_info(self): ????????return?'name?=?{},?age?=?{},?location?=?{}'.format(self.__name,self.__age,self.__location)
查看全部 -
不被外部訪問的屬性為私有屬性,類屬性或?qū)嵗龑傩跃荒軐?duì)其訪問。私有屬性定義以雙下劃線“__”開頭。
class?Animal(object): ????def?__init__(self,name,age): ????????self.name?=?name ????????self.__age?=?age dog?=?Animal('Tom',3) print(dog.__age)???#會(huì)報(bào)錯(cuò)
查看全部 -
面向?qū)ο缶幊蹋簩傩?、 類 、 實(shí)例。
查看全部 -
1、解釋下什么是面向?qū)ο缶幊?/p>
查看全部 -
class Person(object):
? ?__slots__ = ('name', 'gender')
? ?def __init__(self, name, gender):
? ? ? ?self.name = name
? ? ? ?self.gender = gender
class Student(Person):
? ?__slots__ = ('score',)
? ?def __init__(self, name, gender, score):
? ? ? ?self.name = name
? ? ? ?self.gender = gender
? ? ? ?self.score = score
s = Student('Bob', 'male', 59)
s.name = 'Tim'
s.score = 99
print(s.score)注:__slots__ = ('name', 'gender') 限定屬性,不能動(dòng)態(tài)添加屬性
查看全部 -
通過type()函數(shù),可以獲得變量的類型。
通過dir()方法,可以獲取變量的所有屬性:在dir列出的屬性中,有很多是以下劃線開頭和結(jié)尾的,這些都是特殊的方法,稱為內(nèi)建方法,如果已知一個(gè)屬性名稱,要獲取或者設(shè)置對(duì)象的屬性,就需要用 getattr() 和 setattr( )函數(shù)了。
>>> getattr(p, 'name') # 獲取name屬性
'Alice'
>>> setattr(p, 'name', 'Adam') # 設(shè)置新的name屬性
>>> s.name
'Adam'
查看全部
舉報(bào)