1.
经典类定义方式:class People:
新式类定义方式:class People(object):
2.单继承和多继承:
单继承,即class Man(People):,其中People为父类
多继承:即class Man(People, Relation):,继承了People和Relation两个父类 ,构造函数只执行访问到的第一个类的构造函数,其余不执行,执行顺序为从左到右,先执行过的类的函数、变量在下一个类里调用是可以的
3.如何重构父类:
直接重写即可,若子类定义了相同的方法名、变量,就会先执行子类本身的。
比如父类中定义了一下构造函数:
class People:
def __init__(self,name,age,):
self.name = name
self.age = age
子类想要重新加入新的属性变量,下面的加入money变量:
class Man(People):
def __init__(self,name,age,money):#重构父类
People.__init__(self,name,age)#name,age在父类实现
# super(Man,self).__init__(name,age)#另一种方式调用构造函数,方便修改,新式类的继承写法
self.money = money#money在子类实现
print('%s 有%s money'%(self.name,self.money))
4.构造函数的两种调用方式:
其中,一种是‘父类名.构造函数’,比如People.__init__(self,name,age)
另一种是super(子类名,self).构造函数,比如super(Man,self).__init__(name,age)
5.构造函数调用顺序
假设每一个类都有构造函数
子类调用构造函数的顺序:(找到第一个就不在访问后面的构造函数了,后面的都可以访问这个函数的属性方法,因为实例化时会先实例化这个构造方法)
Python2:经典类-深度优先(DBAC),新式类:广度优先(DBCA)
Python3:新式类和经典类都是广度优先(DBCA)
代码示例:
经典类:(单继承)
class People:#经典类
def __init__(self,name,age,):
self.name = name
self.age = age
def eat(self):
print('%s is eating...'%self.name)
def sleep(self):
print('%s is sleeping...' % self.name)
def talk(self):
print('%s is talking...' % self.name)
class Man(People):#继承
def __init__(self,name,age,money):#重构父类
#People.__init__(self,name,age)#name,age在父类实现
self.money = money#money在子类实现
print('%s 有%s money'%(self.name,self.money))
def running(self):#新加入的类方法
print('%s is running...' % self.name)
def sleep(self):#重构了父类的方法
People.sleep(self)#先执行了父类的方法
print('man is sleeping')#有执行了自己重构的方法
class Woman(People):#继承了People类
def get_birth(self):#加入自己的方法
print('%s is a baby'%self.name)
m1 = Man('wuyifan','25',10)
m1.eat()
w1 = Woman('hzt',24)
w1.get_birth()
#两个子类之间的方法无法相互调用
新式类:(多继承和单继承)
class People(object):#新式类
def __init__(self,name,age):
self.name = name
self.age = age
self.friends = []
def eat(self):
print('%s is eating...'%self.name)
class Relation(object):
def make_friends(self,obj):#obj接收对象,保证关联性
print('%s is making friends with %s '%(self.name,obj.name))#继承其他类的变量,另一个继承的类也可以使用变量
self.friends.append(obj)
class Man(People,Relation):#从左到右依次 继承,先执行自己的方法,所以Relation类里的make_friends可以调用People类的属性和方法
def __init__(self,name,age,money):#重构父类
super(Man,self).__init__(name,age)#这种方式继承父类构造函数,方便修改,新式类的继承写法
self.money = money#money在子类实现
print('%s 有%s money'%(self.name,self.money))
def sleep(self):#重构了父类的方法
People.sleep(self)#先执行了父类的方法
print('man is sleeping')#有执行了自己重构的方法
class Woman(People,Relation):
def get_birth(self):
print('%s is a baby'%self.name)
m1 = Man('luhan',25,10)
w1 = Woman('hzt',24)
m1.make_friends(w1)#w1传给obj,保证关联性
w1.name = 'wuyifan'
print(m1.friends[0].name)#’hzt‘改名叫’wuyifan',这里依然是可以记录,不会因为改名找不到,所以用obj,只用name的话传的是字符串,没有关联