python之物件導向進階編程

來源:互聯網
上載者:User

標籤:

@property:

既能檢查參數,又可以用類似屬性這樣簡單的方式來訪問類的變數,可以讓調用者寫出簡短的代碼

class Student(object):  #birth是可讀寫屬性(多定義了一個setter的裝飾器),而age就是一個唯讀屬性      @property      def birth(self):          return self._birth       @birth.setter      def birth(self, value):          self._birth = value       @property      def age(self):          return 2014 - self._birth    ---------------------------------      >>>s = Student()  >>>s.birth = 2000  >>>s.birth  2000  >>>s.age  

 

@classmethod  and @staticmethod@classmethod 和 @staticmethod都可以讓直接以類方式訪問某個內建函數

但@classmethod要求的第一個參數為cls(即類自身,而不是執行個體自身(執行個體自身用self))
@classmethod 的函數可以在類中繼承 http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner 
class Date(object):      def __init__(self, month, day, year):          self.month = month          self.day   = day          self.year  = year       @staticmethod      def millenium_1(month, day):          return Date(month, day, 2000)       @classmethod      def millenium_2(cls, month, day):          #cls is an object that holds class itself          return cls(month, day, 2000)    class DateTime(Date):      def display(self):          return "{0}-{1}-{2} - 00:00:00PM".format(self.month, self.day, self.year)    new_year = Date(1, 1, 2013)               millenium_new_year_1 = Date.millenium_1(1, 1)  millenium_new_year_2 = Date.millenium_1(1, 1)  isinstance(new_year, Date) # True  isinstance(millenium_new_year, Date) # True    datetime1 = DateTime(10, 10, 1990)  datetime2 = DateTime.millenium_1(10, 10)  datetime3 = DateTime.millenium_2(10, 10)  isinstance(datetime1, DateTime) # True  isinstance(datetime2, DateTime) # False  isinstance(datetime2, DateTime) # True 

 

 多重繼承

【1】python中如果子類有自己的建構函式,不會自動調用父類的建構函式,如果需要用到父類的建構函式,則需要在子類的建構函式中顯式的調用。

【2】如果子類沒有自己的建構函式,則會直接從父類繼承建構函式,這在單繼承(一個子類只從一個父類派生)中沒有任何理解上的問題。

         問題:如果是多繼承的情況,一個子類從多個父類派生,而子類又沒有自己的建構函式,則子類預設會繼承哪個父類的建構函式。

【3】子類從多個父類派生,而子類又沒有自己的建構函式時,

(1)按順序繼承,哪個父類在最前面且它又有自己的建構函式,就繼承它的建構函式;

(2)如果最前面第一個父類沒有建構函式,則繼承第2個的建構函式,第2個沒有的話,再往後找,以此類推。

Mixin簡介和多重繼承類似(其實可以把 Mixin 看作多重繼承的一種在特定情境下的應用),
但通常混入 Mixin 的類和 Mixin 類本身不是 is-a 的關係,混入 Mixin 類是為了添加某些(可選的)功能。
自由地混入 Mixin 類就可以靈活地為被混入的類添加不同的功能。
class Dog(Mammal, RunnableMixin, CarnivorousMixin):      pass  

 

定製類

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013946328809098c1be08a2c7e4319bd60269f62be04fa000

https://docs.python.org/2/reference/datamodel.html#special-method-names

1. __str__、 __repr__

class Student(object):    def __init__(self, name):        self.name = name    def __str__(self):        return ‘Student object (name=%s)‘ % self.name    __repr__ = __str__>>>print Student(‘David‘)>>>Student(‘David‘)----------------Student object (name=David)    #__str__Student object (name=David)    #__repr__

 

2 __getattr__

class Student(object):    def __init__(self, name):        self.name = ‘Michael‘    def __getattr__(self, attr):        if attr==‘score‘:            return 99>>>student = Student(‘David‘)>>>student.name>>>student.score>>>print student.grade---------------‘David‘99None    #可以讓class只響應特定的幾個屬性(通過拋出AttributeError的錯誤)

 

3 __iter__

如果一個類想被用於for ... in迴圈,類似list或tuple那樣,就必須實現一個__iter__()方法,該方法返回一個迭代對象,然後,Python的for迴圈就會不斷調用該迭代對象的next()方法拿到迴圈的下一個值,直到遇到StopIteration錯誤時退出迴圈。

class Fib(object):    def __init__(self):        self.a, self.b = 0, 1 # 初始化兩個計數器a,b    def __iter__(self):        return self # 執行個體本身就是迭代對象,故返回自己    def next(self):        self.a, self.b = self.b, self.a + self.b # 計算下一個值        if self.a > 1000: # 退出迴圈的條件            raise StopIteration();        return self.a # 返回下一個值>>> for n in Fib():...     print n,------------------------1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 

 

4 __getitem__

class Fib(object):    def __getitem__(self, n):        a, b = 1, 1        for x in range(n):            a, b = b, a + b        return a------------------------->>> f = Fib()>>> f[0]1>>> f[1]1>>> f[2]2>>> f[10]89>>> f[100]573147844013817084101

 

5 __call__
而且通過callable()函數,我們就可以判斷一個對象是否是“可調用”對象

class Student(object):    def __init__(self, name):        self.name = name    def __call__(self):        print(‘My name is %s.‘ % self.name)>>>student = Student(‘Daivd‘)>>>student()---------------------My name is David.

 

 

2015-05-09

 

 

 

python之物件導向進階編程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.