python的繼承機制,有幾個需要注意的(以下 父類是Animal,屬性有(name, age, gender) ,子類是Dog ,屬性有(name, age, gender,weight) ):
1.屬性繼承一定記得要加上super(),如下圖,不然的子類的屬性就只有你新增的,如下圖,父類有三個屬性 name, age, gender ,子類新增了一個weight屬性, 屬性命名的話一般有三種形式:
- 直接名字 self.weight
- 名字前面加一個下劃線 如 self._weight
- 名字前面加兩個下劃線 如 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)