python自學篇十[ 面向對象 (二) :繼承+多繼承+類屬性+實例屬性]

python基礎系列:
python自學篇一[ Anaconda3安裝 ]
python自學篇二[ pycharm安裝及使用 ]
python自學篇三[ 判斷語句if的使用 ]
python自學篇四[ 基本數據類型和字符串常用處理 ]
python自學篇五[ 列表 ]
python自學篇六[ 元組 ]
python自學篇七[ 字典+深拷貝與淺拷貝 ]描述
python自學篇八[ 循環:while+for+pass+range()+推導式 ]
python自學篇九[ 函數(一):參數+對象 ]
python自學篇九[ 函數(二):返回值return+yield+迭代器+生成器 ]
python自學篇九[ 函數(三):變量作用域+ATM+5個小練習 ]
python自學篇九[ 函數(四):遞歸函數+匿名函數+內置函數+高階函數 ]
python自學篇十[ 面向對象 (一) :面向對象概念+定義類+練習一]
python自學篇十[ 面向對象 (二) :繼承+多繼承+類屬性+實例屬性]
python自學篇十[ 面向對象 (三) :訪問限制+類方法+靜態方法]
python自學篇十[ 面向對象 (四) :王者榮耀小遊戲+模擬一個簡單的銀行進行業務辦理的類]
python自學篇十一[ 模塊簡介+模塊製作+dir()函數+標準模塊+包]
python自學篇十二[ 文件:打開+讀取+寫入+3個習題]

3.繼承和多態

繼承
  • 程序中定義一個class的時候,從現有的class繼承,新class稱之爲子類(Subclass),被繼承的class稱爲基類、父類或超類。
  • 子類繼承了其父類的所有屬性和方法,還可以定義自己的屬性和方法。
#-*- conding:utf-8 -*-
class Animal():
    def __init__(self,name,food):
        self.name = name
        self.food = food

    def eat(self):
        print('%s愛吃%s'%(self.name,self.food))

#聲明一個子類繼承Animal
class Dog(Animal):
    # 加載父類構造方法
    def __init__(self,name,food,drink):
        # Animal.__init__(self,name,food,)
        super(Dog, self).__init__(name,food)
        self.drink = drink  #子類自己的屬性

    #子類自己的方法
    def drinks(self):
        print('%s愛喝%s'%(self.name,self.drink))
class Cat(Animal):
    def __init__(self,name,food,drink):
        #加載父類構造方法
        # Animal.__init__(self,name,food,)
        super(Cat, self).__init__(name,food)
        self.drink = drink  #子類自己的屬性

    #子類自己的方法
    def drinks(self):
        print('%s愛喝%s'%(self.name,self.drink))

    #重寫父類的eat
    def eat(self):
        print('%s特別愛吃%s'%(self.name,self.food))
dog1=Dog('金毛','骨頭','可樂')
dog1.eat()
dog1.drinks()
cat1 = Cat('波斯貓','秋刀魚','雪碧')
cat1.eat()
cat1.drinks()

Python中多繼承的語法格式如下:
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
多繼承例子:
class A():
    def a(self):
        print('我是A裏面的a方法')

class B():
    def b(self):
        print('我是B裏面的b方法')

    def a(self):
        print('我是B裏面的a方法')

class C():
    def c(self):
        print('我是C裏面的c方法')

class D(A,B,C):
    def d(self):
        print('我是D裏面的d方法')

dd = D()
dd.d() #調用自己的方法
dd.c()
dd.a()

結果:

我是D裏面的d方法
我是C裏面的c方法
我是A裏面的a方法

  • 注意圓括號中父類的順序,如果繼承的父類中有相同的方法名,而在子類中使用時未指定,python將從左至右查找父類中是否包含方法。

4.類屬性與實例屬性

屬性

儘量把需要用戶傳入的屬性作爲實例屬性,而把同類都一樣的屬性作爲類屬性。實例屬性在每創造一個類是都會初始化一遍,不同的實例的實例屬性可能不同,不同實例的類屬性都相同。

1:實例屬性:

在__init__(self,…)中初始化

內部調用時都需要加上self.

外部調用時用“對象名.屬性名”調用

2: 類屬性:

在__init__()裏初始化
    在內部用classname.類屬性名調用
    外部既可以用classname.類屬性名又可以用instancename.類屬性名來調用

3:私有屬性:

1:雙下劃線__開頭:外部不可通過“對象名.屬性名”來訪問或者更改實際將其轉化爲了“_類名__屬性名”

單下劃線、雙下劃線、頭尾雙下劃線說明
__foo__: 定義的是特殊方法,類似 __init__() 之類的。  
_foo: 以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能允許其本身與子類進行訪問(創建的實例可以訪問),不能用於 from module import *  
__foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個類本身進行訪問了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章