Python 面向對象編程

wanxingdai 7年前發布 | 24K 次閱讀 面向對象編程 Python Python開發

  • 關鍵字: 類、實例、繼承、類屬性、實例屬性、私有變量、特殊變量
# 聲明一個類(class)
classAnimal(object):
    defeat():
        print('Animal can eat~')

聲明一個子類 Dog,繼承自 Animal

classDog(Animal):

# 聲明一個特殊公有變量(類屬性)
__fatherClass__ = 'Animal'

# 聲明一個私有變量(類屬性)
__currentClass = 'Dog'

# 新建實例時的初始化函數
# 私有變量 __name,__age 為實例屬性
def__init__(self,name,age):
    self.__name = name
    self.__age = age

defwho(self):
    print('A dog, named %s' % self.__name)

# 重寫父類的 eat 方法
defeat():
    print('Dog can eat~')


聲明一個子類 Cat,繼承自 Animal

classCat(Animal):

# 重寫父類的 eat 方法
defeat():
    print('Cat can eat~')



新建一個實例(instance)

dog = Dog('二哈', 3)

dict 存儲實例屬性

dog.dict => {'_Dogname': '二哈', '_Dogage': 3}

</code></pre>

  • __name: 定義私有屬性(前面是兩個下劃線)
  • __name__: 定義特殊公有屬性
  • __dict__: 存儲實例屬性
  • dir(obj): 查看當前對象所有的屬性方法
  • 注意區分實例屬性和類屬性
  • 繼承 最大的好處是子類獲得了父類的全部功能
  • 多態 是同一個行為具有多個不同表現形式或形態的能力,比如上面代碼的 eat 行為有多種不同的表現
# 檢測對象是否擁有某個屬性

hasattr(dog, 'name') => False hasattr(dog, '_Dogname') => True getattr(dog, '_Dogname') => '二哈' </code></pre>

高級概念

  • 關鍵字:slots、@property</p> </li>

  • slots 用來限制實例添加自定義屬性,子類實例允許定義的屬性就是自身的 slots 加上父類的 slots__</p> </li> </ul>

    # 聲明一個類(class)
    classAnimal(object):

    # 限制實例可綁定的屬性
    __slots__ = ()
    
    defeat():
        print('Animal can eat~')
    
    

    聲明一個子類 Dog,繼承自 Animal

    classDog(Animal):

    # 限制實例可綁定的屬性
    __slots__ = ('name','age')
    
    def__init__(self,name):
        self.name = name
    
    

    聲明一個子類 Cat,繼承自 Animal

    classCat(Animal): pass

    新建一個實例(instance)

    dog = Dog('二哈') dog.name => '二哈' dog.age = 3 dog.age => 3 dog.father = '大二哈' => 報錯 </code></pre>

    • @property 裝飾器: 把類中的一個方法變成屬性,然后調用
    classStudent(object):

    def__init__(self, name, idNumber):
        self.__name = name
        self.__idNumber = idNumber
    
    # 讀取屬性 name
    # 因為沒有為 name 屬性設置 setter,所以 name 屬性只讀
    

    @property defname(self): return self.__name

    # 讀取屬性 idNumber
    

    @property defidNumber(self): return self.__idNumber

    # 修改屬性 idNumber
    

    @idNumber.setter defidNumber(self, value): self.__idNumber = value

    s = Student('percy','20141111')

    s.name => 'percy' s.name = 'bob' => 報錯 s.idNumber => '20141111' s.idNumber = '20143333' => '20143333' </code></pre>

    • 多重繼承: 一個子類繼承多個父類
    classFather111(object):
        pass

    classFather222(object): pass

    classFather333(object): pass

    子類 Son 繼承了 3 個父類

    classSon(Father111, Father222, Father333): pass </code></pre>

    • 定制類: 通過為類定義一些特定的方法從而起到定制類的效果。
    classStudent(object):

    # __init__ 用于初始化實例,類似其他語言的構造函數
    def__init__(self, name):
        self.__name = name
    
    # __str__ 在給當前實例應用 str() 方法時調用
    def__str__(self):
        print('你一定給當前實例調用了 str() 方法~')
        return 'some string'
    
    # __len__ 在給當前實例應用 len() 方法時調用
    def__len__(self):
        print('你一定給當前實例調用了 len() 方法~')
        return 111
    
    # __call__ 在把實例對象當成方法使用時調用
    def__call__(self):
        print('你一定把當前實例當方法調用了~')
    
    
    

    p = Student('jack')

    自行運行查看效果

    str(p) len(p) p() </code></pre>

    以上。

     

    來自:http://blog.percymong.com/2017/03/22/python-OOP/

     

 本文由用戶 wanxingdai 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!