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)