关于类的继承
可以理解为:多种类具有类似的属性,为减少代码的重复率,将一些属性抽象出来,生成一个父类 ,其他类继承这个类,可以直接使用父类的方法和属性。
这种情况和现实生活中或者生物学中“类属目”的类似。
可以说着是一种思维方式:归纳总结
将事物分门别类,很容易描述、管理和使用
思想到实现是一个过程,需要一些细节去丰富。
比如父类子类中都有初始化__init__
函数其目的就是为了在实例化的过程中生成一个object对象,这个对象有一些属性是可以通过参数传入。
既然子类和父类都是有__init__
方法,但是实例化子类的时候,怎么能让父类的属性顺利过渡到子类呢,这是这篇文章重点探讨的东西。
下面这张图:
为了能让在子类在实体化时能够正常输入name、lief_value、aggr参数,必须对程序进行修正
很简单,让父类的假装执行__init__
方法执行就好了嘛
方法1、在子类Person_New中要求定义name,life_value,aggr参数
这时我们试验一下传入真实的参数,并调用这些属性和方法
此时我们可以明显的看到我们可以正常使用子类实例egg的money属性、egg也可能正常使用父类的eat方法
由此看来我们可以明显的感受到,我们只要能满足子类实体化
的时候要求传入子类自己的属性参数
和父类要求的属性参数
即可
任何事情不能只有一种方法这时候我们可以看看有没有其他方法,自然python内部为我们提供了其他的方法
方法2
就是直接在子类__init__
方法里直接调用父类的方法就行了,注释掉self.name这些
因为这些属性还要写一遍岂不是很蛋疼,子类再次写上那和不继承又有啥区分呢
所以。。。请看下面这些代码
人是很厉害的自然还要有别的方法,下面
噔噔噔。。。。接下来来登场的就是大名鼎鼎的super方法
方法3
super
方法2中每次都要关注Person_New的父类到底是谁,看一下名字,这样也是不方便的
我们就定义一个函数,super(子类名,子类实例)
super() 函数用于调用下一个父类(超类)并返回该父类实例的方法
图中的super函数就类似于上面执行了Animal.__init__
方法
为了简便,我们可以省略到Person_New,self这两个参数,直接这样写
python中多了个super函数,自然不能仅仅实现这个功能自然还有其他的功能,最常见的就是这个了
摘网上介绍
**
super() 的入门使用
**
在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用super
来实现,比如:
class Animal(object):
def__init__(self, name):
self.name = name
def greet(self):
print 'Hello, I am %s.' % self.name
class Dog(Animal):
def greet(self):
super(Dog, self).greet() # Python3 可使用 super().greet()
print 'WangWang...'
在上面,Animal 是父类,Dog 是子类,我们在 Dog 类重定义了greet
方法,为了能同时实现父类的功能,我们又调用了父类的方法,看下面的使用:
>>> dog = Dog('dog')
>>> dog.greet()
Hello, I am dog.
WangWang..
super
的一个最常见用法可以说是在子类中调用父类的初始化方法了,比如:
class Base(object):
def__init__(self, a, b):
self.a = a
self.b = b
class A(Base):
def __init__(self, a, b, c):
super(A, self).__init__(a, b) # Python3 可使用 super().__init__(a, b)
self.c = c
下面就是重点写一下定义类__init__
方法、类方法、及super中self的问题。
可能可能具体的理解不是很对,但是可以提供一种内在逻辑
现在请记住这句话:
super每次为啥要传入(子类名,子类实例)呢?很简单啊,只有实例才能直接调用init方法啊
或者这么说只有类调用方法时必须传入“self”(实例)参数啊
重点对类的方法进行介绍
注意看一下,最下面绿框和红框中关于类的调用
感觉红色是发展的一个过渡阶段,为了简化最后是绿框中的那个写法
pig.attack(111)
通过上面几个类的定义及调用介绍,我们可以大致认识到
在类的方法使用时我们都是通过实例去调用。而不是通过类.方法去掉用,这样看起来不是很友好及理解
所以通常写法是pig.attack(777)
pig是一个实例,attack是定义类时定义的方法,括号内时定义attack方法时要求除self外传入的参数。
简单总结:pig有个方法,attack .点表示归属关系,括号内为参数
super就是利用实例对__init__方法的调用,不要把__init__方法看的太神圣,就是一个方法而已。实现方法都差不多