-
注意:要想將文件寫成多行,要在每一行的后面加上換行符\n
查看全部 -
read(n)讀取n個字符
readline()讀一行
readlines(n)讀n行,以列表形式返回
讀取一個文件,并把文件內容打印出來
with?open('requirements.txt','r')?as?f: ????lines?=?f.readlines() ????print(lines) ????txt?=?'' ????for?line?in?lines: ????????txt?+=?line ????print(txt) ==> ['paddlepaddle==2.3.2\n',?'paddlenlp==2.4.1\n',?'regex\n',?'fastcore\n',?'scikit-image'] paddlepaddle==2.3.2 paddlenlp==2.4.1 regex fastcore scikit-image
注意:
換行符也是字符!
查看全部 -
在Python中,模塊(功能模塊)就是一個.py文件
查看全部 -
__call__()
工作原理:
當你嘗試以函數的方式調用一個對象時,Python會自動查找該對象的__call__()。
class?Fib(object): ????def?__init__(self): ????????pass ???????? ????def?__call__(self,n): ????????fib_list?=?[] ????????a,b?=?0,1 ????????for?i?in?range(n): ????????????fib_list.append(a) ????????????a,b?=?b,a+b ???????????? ????????return?fib_list f?=?Fib() print(f(10)) ==> [0,?1,?1,?2,?3,?5,?8,?13,?21,?34]
f(10) == f.__call__(10)
查看全部 -
Python是動態語言,實例可動態添加屬性
student.age = 12
__slots__是一個特殊的內置類屬性,用于限定實例屬性
用法:
__slots__ = ('屬性1', '屬性2'...)
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): ????????super().__init__(name,gender) ????????self.score?=?score ???????? s?=?Student('Alice','gril',27) s.age?=?18 ==>AttributeError
__slots__的繼承
在上面的例子中,Student 類繼承了 Person 類的?slots,同時額外定義了一個 score 屬性。這意味著 Student 類的實例只能擁有 name、age 和 score 這三個屬性。
查看全部 -
Rational類的四則運算 class?Rational(object): ????def?__init__(self,?p,?q): ????????self.p?=?p ????????self.q?=?q ????def?__add__(self,?r): ????????return?Rational(self.p?*?r.q?+?r.p?*?self.q,?self.q?*?r.q) ????def?__sub__(self,?r): ????????return?Rational(self.p?*?r.q?-?r.p?*?self.q,?self.q?*?r.q) ????def?__mul__(self,?r): ????????return?Rational(self.p?*?r.p,?self.q?*?r.q) ????def?__truediv__(self,?r): ????????return?Rational(self.p?*?r.q,?self.q?*?r.p) ????def?__str__(self): ????????return?'{}/{}'.format(self.p,?self.q) r1?=?Rational(1,?2) r2?=?Rational(2,?3) print(r1?+?r2,r1-r2,r1*r2,r1/r2) ==> 7/6?-1/6?2/6?3/4
解釋:
1、r1 + r2 相當于 r1.add(r2)? r1調用__add__(self,r2)
2、可以在實例方法中創建本類的實例對象
查看全部 -
對于內建對象(int, list, tuple, dict...),通過str()可以把對象轉換為字符串對象輸出
num = 12
str(num)? ==> '12'l = [1,2,3,4,5]
str(l)? ==> '[1, 2, 3, 4, 5]'t = ('Alice',17)
str(t) ==> '('Alice', 17)'
d = {1: 1, 2: 2}
str(d)? ==> '{1: 1, 2: 2}'對于自定義對象,需要重新定義內建方法__str__()輸出你想輸出的內容
查看全部 -
斐波那契數列是由 0, 1, 1, 2, 3, 5, 8...構成。
請編寫一個Fib類,Fib(10)表示數列的前10個元素,print Fib(10) 可以打印出數列的前 10 個元素,len(Fib(10))可以正確返回數列的個數10。
class?Fib(object): ????def?__init__(self,n): ????????self.fib_list?=?[] ????????a,b?=?0,1 ????????for?i?in?range(n): ????????????self.fib_list.append(a) ????????????a,b?=?b,a+b ???????????? ????def?__str__(self): ????????return?str(self.fib_list) ???????? ????def?__len__(self): ????????return?len(self.fib_list) ???????? f?=?Fib(10) print(f) print(len(f)) ==> [0,?1,?1,?2,?3,?5,?8,?13,?21,?34] 10
查看全部 -
單繼承
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 ???????? t?=?Teacher('Bob','boy','english') print(t.name,t.gender,t.subject) ==>Bob?boy?english
多重繼承
多重繼承的目的是從兩種繼承樹中分別選擇并繼承出子類,以便組合功能使用。
舉個例子,Python的網絡服務器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服務器運行模式有多進程ForkingMixin和多線程ThreadingMixin兩種。
要創建多進程模式的 TCPServer:class MyTCPServer(TCPServer, ForkingMixin)
? ?pass要創建多線程模式的 UDPServer:
class MyUDPServer(UDPServer, ThreadingMixin):
? ?pass如果沒有多重繼承,實現上述所有可能的組合需要 4x2=8 個類。
例:
已知類Student繼承Person類,技能類BasketballMixin繼承SkillMixin類,請通過多重繼承,定義“會打籃球的學生”
class?Person(object): ????def?__init__(self,?name,?age): ????????self.name?=?name ????????self.age?=?age class?SkillMixin(object): ????def?__init__(self,?club): ????????self.club?=?club class?BasketballMixin(SkillMixin): ????def?__init__(self,?club): ????????super(BasketballMixin,?self).__init__(club) class?Student(Person,?BasketballMixin): ????def?__init__(self,?name,?age,?score,?club): ????????super(Student,?self).__init__(name,?age,?club) ????????self.score?=?score s?=?Student('Alice',?17,?98,?'ax') print(s.name,?s.age,?s.score,s.club)
class?Student(Person,?BasketballMixin): ????def?__init__(self,?name,?age,?score,?club): ????????super().__init__(name,?age)?#等于super(Student,self)... ????????super(Person,self).__init__(club) ????????self.score?=?score s?=?Student('Alice',?17,?98,?'ax') print(s.name,?s.age,?s.score,s.club) ==>Alice?17?98?ax
錯誤理解:
super().__init__() 會調用所有父類的__init__方法
正確理解:
super(type, object_or_type=None)
object_or_type?確定要用于搜索的?method resolution order。 搜索會從?type?之后的類開始。
舉例來說,如果?object_or_type?的?__mro__?為?D?->?B?->?C?->?A?->?object?并且?type?的值為?B,則?super()?將會搜索?C?->?A?->?object。
查看全部 -
isinstance(變量, 類型)判斷變量是否為該類型
例:
isinstance(2,int)==>True
查看全部 -
操作實例的私有屬性
==>定義實例方法??
class?Person(object): ????def?__init__(self,?name): ????????self.__name?=?name ????def?get_name(self): ????????return?self.__name ???????? ????def?set_name(self,name): ????????self.__name?=?name ???????? p?=?Person('Alice') print(p.get_name()) p.set_name('Bob') print(p.get_name()) ==> Alice Bob
查看全部 -
操作類的私有屬性
==>定義類方法??
class?Animal(object): ????__count?=?0 ???? ????@classmethod ????def?get_count(cls): ????????return?cls.__count ???????? ????@classmethod ????def?set_count(cls,count): ????????cls.__count?=?count ???? print(Animal.get_count()) Animal.set_count(2) print(Animal.get_count()) ==> 0 2
和實例方法不同的:
1、需要使用@classmethod來標記為類方法,否則定義的還是實例方法
2、類方法的第一個參數將傳入類本身,通常將參數名命名為 cls,上面的 cls.__localtion 實際上相當于Animal.__localtion。
查看全部 -
私有屬性:以雙下劃線'__'開頭
# 類私有屬性
class Animal(object):
? ?__localtion = 'Asia'
print(Animal.__localtion)==>type object 'Animal' has no attribute '__localtion'
# 實例私有屬性
class Animal(object):
? ?def __init__(self, localtion):
? ? ? ?self.__localtion = localtion
dog = Animal('GuangDong')
print(dog.__localtion)==>'Animal' object has no attribute '__localtion'
查看全部 -
請給 Animal類添加一個類屬性 count,每創建一個實例,count 屬性就加 1,這樣就可以統計出一共創建了多少個 Animal的實例。
class?Animal(object): ????count?=?0 ????def?__init__(self): ????????count?+=?1 ???????? dog?=?Animal() cat?=?Animal() print(Animal.count) ==>local?variable?'count'?referenced?before?assignment
class?Animal(object): ????count?=?0 ????def?__init__(self): ????????Animal.count?+=?1 ???????? dog?=?Animal() cat?=?Animal() print(Animal.count) ==>2
問:
為什么在類方法中不能直接訪問類屬性,而是要通過"類.類屬性"?
答:
如果你不加“類.”,他會認為count是__init__方法中的一個局部變量,就會出現上面的錯誤:變量count未定義就使用
所以請注意:
在類方法中引用類屬性也要通過"類.類屬性"的方式?。?!
查看全部 -
類方法的第一個參數必須是self,但是在調用時不必傳入相應的參數。
self指的是類實例對象本身,不是類本身。
查看全部
舉報