1. 程式人生 > >Python的學習筆記DAY5---面向物件

Python的學習筆記DAY5---面向物件

        Python中的類,類以大寫字母開頭定義,以便於和函式區分,例子如下

class Ball:
    def setName(self,name):
        self.name = name
    def say(self):
        print('名字是:%s' % self.name)
        呼叫和結果:

>>> a = Ball()
>>> a.setName('足球')
>>> a.s
>>> a.say()
名字是:足球
        如上程式碼所示,建立了一個Ball類,第一個方法是setName,有兩個引數,第二個方法是say,有一個引數,在下面的呼叫中,setName只傳了一個引數,say沒有穿引數,這是為什麼呢?

        這就是Python面向物件的特點,可以說引數self用來傳的是物件,setName裡邊傳入的足球是傳到了name裡,self接收的值是a,self這個引數時每個方法都必須要帶的。

        關於__init__(前後各兩個下劃線)方法,__init__方法是一個非常重要的方法,類似於C++中的建構函式,把上面的例子改一下:

class Ball:
    def __init__(self,name):
        self.name = name
    def say(self):
        print('名字是:%s' % self.name)
        呼叫和結果:

>>> a = Ball('足球')
>>> a.say()
名字是:足球
        在建立例項a的時候就呼叫了__init__方法。

公有和私有:

        既然有了類,那肯定就會有許可權的問題,Python的公有私有並不像C++,JAVA那樣的使用public和private等來定義,Python裡只是在需要私有的方法或變數前加上兩個下劃線,即可變為私有,舉例如下:

class Poetry:
    __poetry = '苟利國家生死以,豈因禍福避趨之'
    def nianshi(self):
        return self.__poetry
        呼叫和結果:

>>> p = Poetry()
>>> p.__poetry
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    p.__poetry
AttributeError: 'Poetry' object has no attribute '__poetry'
>>> p.nianshi()
'苟利國家生死以,豈因禍福避趨之'
        如上可見,直接呼叫私有的成員會報錯,需要內部呼叫方可訪問。

        其實Python裡的私有是偽私有,使用兩個下劃線之後只是把成員變數重新命名了而已,其實還是可以外部呼叫的,就上面的例子:

>>> p._Poetry__poetry
'苟利國家生死以,豈因禍福避趨之'
         如使用這樣的呼叫方法的話,是可以直接在外部訪問的。

繼承:

        先舉例子:

class Parent:
    def a(self):
        print('正在呼叫父類方法')

class Child(Parent):
    pass

-------------------------------------------    
>>> p = Parent()
>>> p.a()
正在呼叫父類方法
>>> c = Child()
>>> c.a()
正在呼叫父類方法
        如上程式碼所示,類Child的父類是Parent,子類呼叫了父類的方法。當然,子類也可以自己定義方法,子類的屬性和方法不能和父類的屬性和方法同名,否則會在子類的呼叫中覆蓋父類的屬性和方法。

        有一種特殊情況,父類裡有__init__方法,子類也需要__init__方法,這個時候如果直接寫的話子類會把父類的方法覆蓋掉,這裡解決的方法有兩個,第一種叫未繫結的父類方法,這種方法就是在子類的__init__方法中先呼叫一下父類的__init__方法,比如上面的例子的Parent中加入有個方法__init__(self),在Child的__init__(self)方法中先呼叫一下Parent.__init__(self)即可。第二種方法叫做super()函式,可以直接在子類的__init__(self)方法中呼叫super().__init__()即可。

        關於多重繼承,只需要把需要繼承的父類名都寫到括號中就可以了就像 class Child(Father1,Father2,Father3,······)即可。

組合:

        有縱向關係的可以使用繼承,有橫向關係的就需要到了組合,組合是指把類的例項化放到新的類中,例子如下:

class O2:
    def __init__(self,o):
        self.num = o

class N2:
    def __init__(self,n):
        self.num = n
        
class Air:
    def __init__(self,o,n):
        self.O2 = O2(o)
        self.N2 = N2(n)

    def print_air(self):
        print('空氣中有氧氣 %d ,氮氣 %d ' % (self.O2.num, self.N2.num))

---------------------------------------------------------------------------
>>> a = Air(20,78)
>>> a.print_air()
空氣中有氧氣 20 ,氮氣 78