python 類繼承原理

python的繼承機制,有幾個需要注意的(以下 父類是Animal,屬性有(name, age, gender) ,子類是Dog ,屬性有(name, age, gender,weight) ):

1.屬性繼承一定記得要加上super(),如下圖,不然的子類的屬性就只有你新增的,如下圖,父類有三個屬性 name, age, gender ,子類新增了一個weight屬性, 屬性命名的話一般有三種形式:

  1. 直接名字 self.weight
  2. 名字前面加一個下劃線 如 self._weight
  3. 名字前面加兩個下劃線 如 self.__weight
    區別的話主要是訪問和修改權限:
    第1種,屬性在類內、類外、子類都是可以訪問和修改的,子類如果在不知道父類有此屬性的話很容易造成覆蓋;
    第2種的話,訪問權限和第1種一樣,不過爲了防止子類意外覆蓋父類屬性,約定俗成的名義上的“私有屬性”,意思就是大家把帶一個下劃線的屬性當成私有的,儘量不在類外去訪問和修改它。
    第3種是真正的私有屬性,類內可以訪問,但是類外和子類繼承都不能直接訪問(其實可以通過引用父類類名來進行訪問,原因是子類繼承父類的私有屬性時,其實只是把屬性名字給改了),子類要訪問的父類的私有屬性的話,一般要父類裏設置了方法來訪問

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

def __init__(self, name, age='1', gender=0, weight=10):
        super(Dog, self).__init__(name, age, gender)
        self.__weight = weight
from enum import Enum


class Gender(Enum):
    Male = 0
    Female = 1


class Animal(object):

    def __init__(self, name, age='1', gender=0):
        self.__name = name  # 私有成員在子類中不能直接通過self調用,可以通過繼承公共方法調用
        self.__age = age
        self.__gender = gender

    def get_name(self):
        return self.__name

    def run(self):
        print('the Animal ' + self.get_name() + ' is running...')

    def info(self):  # 輸出相關信息
        print('my info is: ')
        print('name: ' + self.get_name())
        print('age: ' + self.__age)
        if self.__gender:
            print('gender: female')
        else:
            print('gender: male')


class Dog(Animal):

    def __init__(self, name, age='1', gender=0, weight=10):
        super(Dog, self).__init__(name, age, gender)
        self.__weight = weight

    def run(self):
        print('the Dog ' + self.get_name() + ' is running...')


def run(Animal):
    Animal.run()


if __name__ == '__main__':
    an = Animal('blake')
    dog = Dog('haki')
    run(an)
    run(dog)

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