【1.106】面向对象 继承

比较官方的说法就是:

继承(英语:inheritance)是面向对象软件技术当中的一个概念。

如果一个类别 son “继承自”另一个类别 father,就把这个 son 称为“ father 的子类别”,

而把 father 称为“ son 的父类别” 也可以称 “father 是 son 的超类”。

继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。

在定义 子类别 继承 父类别 的同时,可以重新定义某些属性,并重写某些方法,

即 覆盖从父类别继承来的 原有属性和方法,使其获得与父类别不同的功能。

注意不是覆盖父类的属性和方法。

另外,为子类别追加新的属性和方法也是常见的做法。

一般静态的面向对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。 字面意思就是:

子承父业,合法继承家产,就是如果你是独生子,

而且你也很孝顺,不出意外,你会继承你父母所有家产,他们的所有财产都会由你使用(败家子儿除外)。

但是要注意和现实中的父子关系  稍有差别 有些东西是父亲的就是父亲的,有些东西你是继承 不来的 

程序语言的 继承是完全继承的

class Animal:
    '''
    动物父类
    '''
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
class Dog(Animal):
    '''狗类'''
    pass
class Cat(Animal):
    '''猫类'''
    pass

继承的优点也是显而易见的:

1,增加了类的耦合性(耦合性不宜多,宜精)。

2,减少了重复代码。

3,使得代码更加规范化,合理化。

--------------------------------------------------------------------------------------------------------------

就向上面的例子:

Aminal 叫做父类,基类,超类。
Cat Dog: 子类,派生类。


继承:可以分单继承,多继承

 

这里需要补充一下python中类的种类(继承需要):

在python2x版本中存在两种类.:
  ⼀个叫经典类. 在python2.2之前. ⼀直使⽤的是经典类. 经典类就是基类的根什么都不写.
  ⼀个叫新式类. 在python2.2之后出现了新式类. 新式类的特点是基类的根是object类。
python3x版本中只有一种类:
python3中使⽤的都是新式类. 如果基类谁都不继承. 那这个类会默认继承 object

 

 

class Aniaml(object):
    type_name = '动物类'
    def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex
    def eat(self):
        print(self)
        print('吃东西')

# c1=Aniaml("cat","male",1)
# print (c1.eat(1111))

Aniaml.eat(222)             #类访问方法
# 222
# 吃东西

class Cat(Aniaml):
    pass
class Dog(Aniaml):
    pass

# 类名:
print(Dog.type_name)        # 可以调用父类的属性,方法。  动物类
Dog.eat(111)                #  111 吃东西   类访问方法
print(Dog.type_name)        # 动物类

# 对象:
# 实例化对象
p1 = Cat('春哥','',18)
print(p1.__dict__)          # {'name': '春哥', 'age': 18, 'sex': '男'}


# 对象执行类的父类的属性,方法。
print(p1.type_name)         # 动物类
p1.type_name = '666'
print(Aniaml.type_name)     # 动物类
print(p1.type_name)         # 666
print(p1)                   # <__main__.Cat object at 0x00000000027A5710>
p1.eat()                    # 对象访问方法
# <__main__.Cat object at 0x00000000027A5710>
# 吃东西

 

---------------

---------------

---------------

执行顺序  就是在类里面找,先找自己的类 然后再找父类

class Aniaml(object):
    type_name = '动物类'
    def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex

    def eat(self):
        print(self)
        print('吃东西')

class Person(Aniaml):
    
    def eat(self):
        print('%s 吃饭'%self.name)
        
class Cat(Aniaml):
    pass

class Dog(Aniaml):
    pass

p1 = Person('barry','',18)
# 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找。
p1.eat()
# 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。

执行顺序

 

posted @ 2016-05-13 15:52  科学小怪癖  阅读(95)  评论(0)    收藏  举报