继承
继承:定义类的时候,在类名后面加上它的父类
继承以后,可以使用父类的方法,同时还可以针对不满足条件的方法进行重写,除此之外,还可以新增独有的方法
class Animal: #父类
def eat(self):
print("吃东西")
def drink(self):
print("水")
def sleep(self):
print("闭眼睡觉")
class Newzebra(Animal): #斑马
def __init__(self,name):
self.name=name
def eat(self): #重写父类方法
super().eat() #super代表实例化自己的父类
print("吃稻草")
def colour(self):
print("身上有条纹")
class lion(Animal):
def __init__(self,name):
self.name=name
def Characteristics(self):
print("特别凶")
def eat(self):
print("肉")
nl=lion("狮子")
nl.eat()
nl.Characteristics()
nz=Newzebra("斑马")
nz.eat()
nz.drink()
nz.sleep()
nz.colour()
1、类:变量:实例变量、类变量+操作他们的方法,局部变量
2、本质:把需要管理的数据封装到实例里面,然后基于类中的方法定义规则,以此来失效业务数据的完整性和一致性(防止出现脏数据)
3、类变量:不加self表示类变量,不需要实例化就可以直接使用,类变量在整个实例化的对象中是公用的,类变量通常不作为实例变量使用
4、局部变量:在方法中或者函数中定义,就是局部变量
5、数据成员:类变量或者实例变量
6、实例变量:加了self的表示实例变量,定义在方法中的变量,只作用于当前实例的类
class Person:
count=0
def __init__(self,name):
self.name=name
class Person: #父类
count=0 #类变量
def __init__(self,name):
self.name=name #实例变量,
def get_name(self):#self传递的参数是实例的内存地址,告诉这个方法使用哪个实例的数据
return self.name
def set_name(self):
self.name="globle"
p=Person() #实例p
p1=Person() #实例p1
print(id(p)) #实例p地址
print(id(p1)) #实例p1地址
print(id(Person)) #类地址
7、类在内存中只有一个份,每个实例有各自在内存中保存的地址,各自独立
wxy=Person("王晓艳")
print(wxy.get_name())
8、子类继承了所有的父类方法
9、子类中需要初始化父类,提供完整的构造函数的初始化,满足父类的所有参数使用要求
10、子类没有实现__init__方法时,会自动调用父类的__init__方法
11、父类中__init__方法如果需要传入参数,则会报错,需要在实例化时候传入参数
12、父类中的私有方法和私有类,不能被子类调用和继承
class Teacher(Person): #子类
count=0
def __init__(self,name,salary):
Person.__init__(self,name)
self.salary=salary
Teacher.count+=1
def get_name(self):#重写,overridde:把父类的方法做了重写
return "mygirl:"+self.name
t=Teacher("WXY",1000) #触发了__init__的执行了,叫实例化
print(t.get_name())
s=Teacher("TSH",10000)
print(s.get_name())
print(Teacher.count)
print(t.count)
13、 判断是否是类的实例
if isinstance(t,Person):
print(“t是Person的实例”)
else:
print(“t不是Teacher的实例”)
14、python新式类,广度优先
1)类为经典类时,多继承情况下,会按照深度优先查找
2)类为新式类时,多继承情况下,会按照广度优先查找
class D:
def test(self):
print("D")
class C(D):
def test(self):
print("C")
class B(D):
def test(self):
print("B")
class A(B, C):
def test(self):
print("A")
a = A()
a.test()
广度优先:当调用A类test函数时,如下图所示,先查找A类有无test函数,再查找B类,再查找C类,最后查找D类。
深度优先:当调用A类test函数时,如下图所示,先查找A类中有无test函数,再查找B类,再查找D类,最后查找C类
15、抽象:把某一类对象,他们共同拥有的能力抽离出来实现一个父类,基于这个父类来定义各自不同的子类