◆ 靜態方法:
通過@staticmethod裝飾器即可把其裝飾的方法變為乙個靜態方法。普通的方法,可以在例項化後直接呼叫,並且在方法裡可以通過self.呼叫例項變數或類變數。靜態方法是不可以訪問例項變數或類變數的,它與類唯一的關聯就是需要通過類名來呼叫這個方法。
class
dog(object):
def__init__
(self,name):
self.name = name
@staticmethod #把eat方法變為靜態方法
defeat
(self):
print("%s is eating" % self.name)
d = dog("chenronghua")
d.eat()
上面的呼叫會出以下錯誤,說是eat需要乙個self引數,但呼叫時卻沒有傳遞,沒錯,當eat變成靜態方法後,再通過例項呼叫時就不會自動把例項本身當作乙個引數傳給self了。
traceback (most recent call
last):
file "/users/jieli/pycharmprojects/python基礎/自動化day7物件導向高階/靜態方法.py", line 17, in
d.eat()
typeerror: eat() missing 1 required positional argument: 'self'
想讓上面的**可以正常工作有兩種辦法
呼叫時主動傳遞例項本身給eat方法,即d.eat(d)
在eat方法中去掉self引數,但這也意味著,在eat中不能通過self.呼叫例項中的其它變數了
◆ 類方法:
類方法通過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變數,不能訪問例項變數
class
dog(object):
def__init__
(self,name):
self.name = name
@classmethod
defeat
(self):
print("%s is eating" % self.name)
d = dog("chenronghua")
d.eat()
執行報錯如下,說dog沒有name屬性,因為name是個例項變數,類方法是不能訪問例項變數的
traceback (most recent call
last):
file "/users/jieli/pycharmprojects/python基礎/自動化day7物件導向高階/類方法.py", line 16, in
d.eat()
file "/users/jieli/pycharmprojects/python基礎/自動化day7物件導向高階/類方法.py", line 11, in eat
print("%s is eating" % self.name)
attributeerror: type object 'dog' has no attribute 'name'
此時可以定義乙個類變數,也叫name,看下執行效果
class
dog(object):
name = "我是類變數"
def__init__
(self,name):
self.name = name
@classmethod
defeat
(self):
print("%s is eating" % self.name)
d = dog("chenronghua")
d.eat()
#執行結果
我是類變數 is eating
◆ 屬性方法:
通過@property把乙個方法變成乙個靜態屬性
class
dog(object):
def__init__
(self,name):
self.name = name
@property
defeat
(self):
print(" %s is eating" %self.name)
d = dog("chenronghua")
d.eat()
呼叫會出以下錯誤, 說nonetype is not callable, 因為eat此時已經變成乙個靜態屬性了, 不是方法了, 想呼叫已經不需要加()號了,直接d.eat就可以了
traceback (most recent call
last):
chenronghua is eating
file "/users/jieli/pycharmprojects/python基礎/自動化day7物件導向高階/屬性方法.py", line 16, in
d.eat()
typeerror: 'nonetype' object is
not callable
正常呼叫如下
d = dog("chenronghua")
d.eat
輸出 chenronghua is eating
★ 屬性方法的場景:
想知道乙個航班當前的狀態,是到達了、延遲了、取消了、還是已經飛走了, 想知道這種狀態你必須經歷以下幾步:
1. 連線航空公司api查詢
2. 對查詢結果進行解析
3. 返回結果給你的使用者
因此這個status屬性的值是一系列動作後才得到的結果,所以每次呼叫時,都要經過一系列的動作才返回結果,但這些動作過程不需要使用者關心,使用者只需要呼叫這個屬性就可以。
class
flight
(object):
def__init__
(self,name):
self.flight_name = name
defchecking_status
(self):
print("checking flight %s status " % self.flight_name)
return
1@property
defflight_status
(self):
status = self.checking_status()
if status == 0 :
print("flight got canceled...")
elif status == 1 :
print("flight is arrived...")
elif status == 2:
print("flight has departured already...")
else:
print("cannot confirm the flight status...,please check later")
f = flight("ca980")
f.flight_status
如果需要更改這個屬性,需要通過@proerty.setter裝飾器再裝飾一下。寫乙個新方法, 對這個flight_status進行更改:
class
flight
(object):
def__init__
(self,name):
self.flight_name = name
defchecking_status
(self):
print("checking flight %s status " % self.flight_name)
return
1@property
defflight_status
(self):
status = self.checking_status()
if status == 0 :
print("flight got canceled...")
elif status == 1 :
print("flight is arrived...")
elif status == 2:
print("flight has departured already...")
else:
print("cannot confirm the flight status...,please check later")
@flight_status.setter #修改
defflight_status
(self,status):
status_dic =
print("\033[31;1mhas changed the flight status to \033[0m",status_dic.get(status) )
@flight_status.deleter #刪除
defflight_status
(self):
print("status got removed...")
f = flight("ca980")
f.flight_status
f.flight_status = 2
#觸發@flight_status.setter
del f.flight_status #觸發@flight_status.deleter
python基礎篇 Class 類
class 類 特點 乙個抽象的物件,是物件導向語言的核心,類可以不繼承或多繼承。標識 class 例子 class a object 這是乙個演示的類 count a def init self,a self.a a def str self print count a s,list a s se...
Python類中的方法(CLASS)
在類中可以根據需要定義一些方法,定義方法採用def關鍵字,在類中定義的方法至少會有乙個引數,一般以名為 self 的變數作為該引數 用其他名稱也可以 而且需要作為第乙個引數。舉例 class people sname xiaohong high 172.5 weight 180 男 def eat ...
8 1 學習python的類class
二 定義和使用類 早期的程式語言是面向過程的,資料和函式之間是沒有任何直接聯絡的,它們之間聯絡的方式就是通過函式呼叫提供引數的形式將資料傳入函式進行處理,但這可能因為錯誤的傳遞引數 錯誤地修改了資料而導致程式出錯,當需要修改或維護程式時要從程式提供的一堆資料中去尋找和修改它們。要擴充套件函式的功能,...