python学习笔记之--继承

江枫思渺然 提交于 2019-12-02 05:35:20
#继承:子类具备所有父类的共有变量和共有方法(除私有的)
如果子类没有定义__init__构造方法,会自动调用父类的。
好处:站在老爸的肩膀上,增加属性,增加方法
      在原有的基础上进行扩展。
class Person:
    count = 0 #类变量
    nation = "中国"
 
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")
 
    def get_name(self):#实例方法,必须要实例化
        return self.name
 
class ChinaPerson(Person):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender):
        Person.__init__(self,name,gender)  #调用父类的构造函数:类名+构造函数
 
    def get_gender(self):
        return self.gender
 
cp = ChinaPerson("吴老师","男")
print(cp.count)
print(cp.name)
print(cp.gender)
print(cp.get_name())
C:\Users\dell\Desktop\练习\6>py -3 0616.py
创建了一个新的人
1
吴老师
吴老师
 
 
 
#多继承: 在括号里面写上多个基类(父类)
子类的构造函数,如果没有实现,则调用第一个基类的构造函数。
class Person:
    count = 0 #类变量
    nation = "中国"
 
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")
 
    def get_name(self):#实例方法,必须要实例化
        return self.name
 
class Bird:
 
    def __init__(self,color):
        print("a bird is birthed!")
        self.color = color
 
    def fly(self):
        print("I can fly in the sky!")
 
class ChinaBirdPerson(Person,Bird):  #括号里写上多个基类
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender,color):
        Person.__init__(self,name,gender)  #基类的两个构造方法都要调用,才能使用各自类的变量
        Bird.__init__(self,color)
 
    def get_gender(self):
        return self.gender
 
cp = ChinaBirdPerson("吴老师","男","红色")
print(cp.color)
print(cp.get_name()) #继承了Person类的方法
print(cp.fly()) #继承了Bird类的方法
C:\Users\dell\Desktop\练习\6>py -3 0616.py
创建了一个新的人
a bird is birthed!
红色
吴老师
I can fly in the sky!
None
 
 
#多继承,当继承的类存在同名的方法,调用时先执行左边的类Person,如果左边没有时会找右边类的方法
class Person:
    count = 0 #类变量
    nation = "中国"
 
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")
 
    def get_name(self):#实例方法,必须要实例化
        return self.name
    
 
class Bird:
 
    def __init__(self,color):
        print("a bird is birthed!")
        self.color = color
 
    def fly(self):
        print("I can fly in the sky!")
 
    def get_name(self):#实例方法,必须要实例化
        return "bird has no name"
 
class ChinaBirdPerson(Person,Bird):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender,color):
        Person.__init__(self,name,gender)
        Bird.__init__(self,color)
 
    def get_gender(self):
        return self.gender
 
cp = ChinaBirdPerson("吴老师","男","红色")
print(cp.get_name())
C:\Users\dell\Desktop\练习\6>py -3 0616.py
创建了一个新的人
a bird is birthed!
吴老师
 
 
#python3多继承情况下找同名方法的时候,按照深度优先原则查找
从父类、爷爷类去查找方法,叫做深度优先
从多继承的同级类去查找方法,叫做广度优先
class P:
    def get_name(self):
        return "P name!"    
    pass
 
class Person(P):
    count = 0 #类变量
    nation = "中国"
 
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
        Person.count +=1
        print("创建了一个新的人")
 
    
 
class Bird:
 
    def __init__(self,color):
        print("a bird is birthed!")
        self.color = color
 
    def fly(self):
        print("I can fly in the sky!")
 
    def get_name(self):#实例方法,必须要实例化
        return "bird has no name"
 
class ChinaBirdPerson(Person,Bird):
      #如果子类没有定义__init__构造方法
      #会自动调用父类的。
    def __init__(self,name,gender):
        Person.__init__(self,name,gender)
        #Bird.__init__(self,color)
 
    def get_gender(self):
        return self.gender
 
cp = ChinaBirdPerson("吴老师","男")
print(cp.get_name())
C:\Users\dell\Desktop\练习\6>py -3 0616.py
创建了一个新的人
P name!
 p  -->get_name(爷爷类)
       Person(父类)                Bird-->get_name(父类)
          ChinaBirdPerson(孙类)
 
cp.get_name()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!