物件導向高階語法部分
## 透過@staticmethod#裝飾器即可把其裝飾的方法變成一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在實例化後直接調用,並且在方法裡可以通過self.調用實例變量或類變量,但靜態方法是不可以訪問實例變量或類變量的,一個不能訪問實例變數和類別變數的方法,其實相當於跟類別本身已經沒什麼關係了,它與類別唯一的關聯就是需要透過類別名稱來呼叫這個方法。
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @staticmethod def talk(): print("I like to study python")class Teacher(SchoolMember): def __init__(self,name,age,sex,course,salary): super(Teacher,self).__init__(name,age,sex) self.course = course self.salary = salary def Teaching(self): print("Teacher %s is teaching %s." %(self.name,self.course)) s1 = Teacher("alex",22,"Femal","python",10000) print("before:",s1.member_nums) SchoolMember.member_nums = 12print("before:",s1.member_nums) s1.member_nums = 666 #是在类中重新生成一个变量 print("after:",s1.member_nums) SchoolMember.member_nums = 12print("after:",s1.member_nums)
在上面程式碼中,member_nums是類別變量,如果直接呼叫s1.member_nums的話,呼叫的是類別裡面的值;如果s1.member_nums = 666,等於在實例裡面增加了一個新的變量,這個時候,修改類別的值的時候,是不會影響實例裡面變數的值的。上面代碼的輸出結果如下:
before: 0 before: 12
after: 666
after: 666
類別的靜態方法@staticmethon:
SchoolMember(==== % % %= SchoolMember(,,
上面程式碼中,如果沒有@staticmethon的話,程式執行肯定沒有問題,但是當有了@staticmethod的時候,系統提示少了一個參數。如果我們把一個方法變成了一個靜態方法,那麼這個方法與實例就沒有太大的關係了。
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %SchoolMember.member_nums) @staticmethod #让方法在类中剥离,与类没有关系,调用要传递参数 def walk(self): print("%s is walking......" %self) #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.walk("alex")
@staticmethod靜態方法是讓類別中的方法與類別沒有關聯,呼叫的時候要傳遞參數才能呼叫。
類別方法
類別方法通#過@classmethod#裝飾器實現,類別方法和普通方法的差異是, 類別方法只能存取類別變量,不能存取實例變數
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) #@classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %self.name) SchoolMember.member_nums #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.talk()
上面程式碼中,(1)類別是不能直接存取實例裡面的屬性的;(2)@classmethod的作用是讓程式只能存取類別中的變量,例如上面程式碼中的SchoolMember.member_nums ,這個是類別的方法,我們可以在talk中進行訪問,但是不能訪問self.name,因為@classmethod只能存取類別屬性。
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %self.name) SchoolMember.member_nums #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.talk() 运行结果如下: Traceback (most recent call last): File "/home/zhuzhu/day7/staticmethon方法.py", line 18, in <module>s1.talk() File "/home/zhuzhu/day7/staticmethon方法.py", line 13, in talk print("%s like to study python" %self.name) AttributeError: type object 'SchoolMember' has no attribute 'name'</module>
從上面可以看出,上面的程式碼@classmethon禁止了類別中的實例變量,只能使用類別變數。即不能使用self.name、self.age和self.sex,只能使用self.nember_nums和SchoolMember.member_nums類別的變數。如下:
class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex member_nums = 0def introduce(self): print("My name is %s,and I am %s year old." %(self.name,self.age)) @classmethod #类方法,不能访问实例变量 def talk(self): print("%s like to study python" %SchoolMember.member_nums) SchoolMember.member_nums #SchoolMember.talk() #不能调用,类是没有办法访问实例变量,只能访问自己 s1 = SchoolMember("Alex",22,"Female") #实例化 s1.talk() 运行结果如下:0 like to study python
屬性方法
屬性方法的作用是透過@property把一個方法變成一個靜態屬性
SchoolMember(==== % % %= SchoolMember(,,
# 如果不添加@property的話,程式是能夠正常運作的,但是添加了@ property之後,程式運行出現錯誤,是什麼原因呢?因為@property是將類別的方法變成了類別的屬性,呼叫的時候我們只需執行s1.walk()無需添加括號即可執行,如下:##
SchoolMember(==== % % %= SchoolMember(,,上面程式碼中,@property是將類別的方法變成了成員的屬性,我們可以直接使用s1.walk來呼叫。
#經典類別vs新式類別
class A: #经典类的写法,新式类是A(object)尽量少用经典类,都用新式类现在 def __init__(self,name): self.name = name def f1(self): print("f1,搞基")class B(A): def __init__(self,name): super(B,self).__init__(name) # def f1(self): # print("f1,来呀")class C(A): def __init__(self,name): super(C,self).__init__(name) #def f1(self): #print("f1,一起搞!")class D(B,C): pass d = D("Alex") d.f1()
上面程式碼中,D類別繼承了B類和C類,當我們執行D類中的方法是,首先是在B類中進行查找,這個經典類和新式類別都是一樣的,如果查找不到,經典類別是去A類別中進行查找,而新式類別是去C類別中查找,實例如下:(備註:必須去2.X版本中執行才有差別,3 .X進行最佳化,B類中查找不到都去C類中查找)
以下是經典類別和新式類別的執行順序:
以上是物件導向進階的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用