python類中的方法
上一篇中講到 建立了類,並且重點講述了建構函式以及類例項,特別是對那個self,描述了不少。在講述建構函式的時候特別提到,init()是一個函式,只不過在類中有一點特殊的作用罷了,每個類,首先要執行它,它規定了類的基本結構。
資料流轉過程
除了在類中可以寫這種函式之外,在類中還可以寫別的函式,延續上一個例子:
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang="golang", website="www.google.com"):
self.name = name
self.lang = lang
self.website = website
self.email = "hiekay@gmail.com"
def author(self):
return self.name
hiekay = Person("hiekay")
info = Person("h",lang="python",website="hiekay.github.io")
print "Author name from hiekay:",hiekay.author()
print "Author name from info:",info.author()
#執行結果
Author name from hiekay: hiekay
Author name from info: h
這段程式碼比多了一個函式author(self),這個我們先不管,稍後會詳細分解。首先看看資料是如何在這個程式碼中流轉的。
定義類Person,然後建立例項hiekay=Person(“hiekay”)。hiekay這個例項和Person類中的self對應,它們都是引用了例項物件(很多時候簡化說成是例項物件)。”hiekay”是一個具體的資料,通過建構函式中的name引數,傳給例項的屬性self.name,在類Person中的另外一個方法author的引數列表中第一個就是self,表示要承接self物件,return self.name,就是在類內部通過self物件,把它的屬性self.name的資料傳導如author。
當執行hiekay.author()的時候,就是告訴上面的程式碼,呼叫hiekay例項物件,並得到author()方法的結果,hiekay這個例項就自動被告訴了author()(注意,self引數在這裡不用寫,這個告訴過程是python自動完成的,不用我們操心了),author方法就返回hiekay例項的屬性,因為前面已經完成了hiekay與self的對應過程,所以這時候author裡面的self就是hiekay,自然self.name=hiekay.name。
再做一個實驗,那就是在author中,return hiekay.name,看看什麼效果。因為既然hiekay和self是同一個例項物件,直接寫成hiekay.name是不是也可以呢?
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang="golang", website="www.google.com"):
self.name = name
self.lang = lang
self.website = website
self.email = "hiekay@gmail.com"
def author(self):
#return self.name
return hiekay.name #返回
hiekay = Person("hiekay")
info = Person("h",lang="python",website="hiekay.github.io")
print "Author name from hiekay:",hiekay.author()
print "Author name from info:",info.author()
#輸出結果
Author name from hiekay: hiekay #hiekay例項輸出結果
Author name from info: hiekay #info例項輸出結果
從結果中可以看出,沒有報錯。但是,info這個例項輸出的結果和hiekay例項輸出的結果一樣。原來,當呼叫了info例項之後,執行到author(),返回的是hiekay.name。所以,這裡一定要用self例項。在呼叫不同的例項時,self會自動的進行匹配,當然,匹配過程是python完成,仍然不用我們操心。
為什麼要用到方法
在類裡面,可以用def語句來編寫函式,但是,通常這個函式的樣子是這樣的:
class ClassName:
def __init__(self,*args):
...
def method(self,*args): #是一個在類裡面的函式
...
在類ClassName裡面,除了前面那個具有初始化功能的建構函式之外,還有一個函式method,這個函式和以前學習過的函式一樣,函式裡面要寫什麼,也沒有特別的規定。但是,這個函式的第一個引數必須是self,或者說,可以沒有別的引數,但是self是必須寫上並且是第一個。這個self引數的作用前面已經說過了。
這樣看來,類裡面的這個函式還有點跟以前函式不同的地方。
類裡面的這個函式,我們就稱之為方法。
之所以用方法,也是用類的原因,也是用函式的原因,都是為了減少程式碼的冗餘,提高程式碼的重用性,這也是OOP的原因。
方法怎樣被重用呢?看本最開始的那段程式碼,裡面有一個author方法,不管是hiekay還是info例項,都用這個方法返回例項匯入的名字。這就是體現了重用。
編寫和操作方法
編寫方法的過程和編寫一個函式的過程一樣,需要注意的就是要在引數列表中第一個寫上self,即使沒有其它的引數。
#!/usr/bin/env python
#coding:utf-8
class Person:
def __init__(self, name, lang="golang", website="www.google.com"):
self.name = name
self.lang = lang
self.website = website
self.email = "hiekay@gmail.com"
def author(self, address):
#return self.name
return hiekay.name+" in "+address
hiekay = Person("hiekay")
info = Person("h",lang="python",website="hiekay.github.io")
print "Author name from hiekay:",hiekay.author("China")
print "Author name from info:",info.author("SH")
#執行結果
Author name from hiekay: hiekay in China
Author name from info: hiekay in SH
這段程式碼中,對author方法增加了一個引數address,當呼叫這個方法的時候:hiekay.author(“China”),要對這個引數賦值,在類中,這個方法顯示是有兩個引數(self,address),但是在呼叫的時候,第一個引數是自動將例項hiekay與之對應起來,不需要顯化賦值,可以理解成是隱含完成的(其實,也可以將hiekay看做隱藏的主體,偷偷地跟self勾搭上了)。
通過上面的講述,看官可以試試類了。提醒,一定要對類的資料流通過程清晰。
相關文章
- Python中類的建立和使用方法Python
- Python的類方法Python
- python中類方法的區別是什麼Python
- Python 裝飾器裝飾類中的方法Python
- Python 中的類(中)Python
- Python 簡明教程 --- 20,Python 類中的屬性與方法Python
- Python中類方法過載---大部分Python
- 理解Python中的類物件、例項物件、屬性、方法Python物件
- Python_11 類的方法Python
- Python類的專用方法Python
- python建立類和類方法Python
- String類中的equals方法與Object類中的equals方法的不同點Object
- Python中如何使用構造方法定義類Python構造方法
- Python中類方法和例項方法有什麼區別?Python
- Python建立類方法Python
- Python中,類的特殊方法與內建函式的關聯Python函式
- 簡述Python類中的 __init__、__new__、__call__ 方法Python
- Python中動態類和動態方法的建立與呼叫Python
- Python Class 的例項方法/類方法/靜態方法Python
- Python中的類和物件(中級)Python物件
- Python中的類與物件Python物件
- Python中類的定義Python
- python中的元類MetaclassPython
- 理解Python中的元類Python
- python中calss(類)的使用,類的教程,類中的函式怎麼呼叫。Python函式
- Java中Object類的常用方法JavaObject
- Java中Scanner類的常用方法Java
- Java中Integer類的基本方法Java
- Python 靜態方法和類方法的區別Python
- Python的靜態方法和類成員方法Python
- Python基礎之:Python中的類Python
- Python例項方法、類方法、靜態方法Python
- 初學Python過程中,例項方法和類方法的區別是什麼?Python
- python之建立類的兩種方法Python
- Python 類變動的鉤子方法Python
- Python中列表的方法Python
- 徹底搞懂Python中的類Python
- php中呼叫類的私有方法PHP