1.继承:子类继承父类的属性和方法,被继承的类叫做父类,继承的类叫做子类。
案例一:
'''
继承:父类、子类
经典类: class 类名:
新式类: class 类名(object):
'''
#父类
class A(object):
def __init__(self):
self.name='父类'
def printinfo(self):
print(f'这是:{self.name}')
class B(A):
pass
b=B()
b.printinfo()
print(b.name)
运行结果:
这是:父类
父类
2.单继承和多继承:
案例一:
#父类
#单继承
# class Muxue(object):
# def __init__(self):
# self.name='父类'
# def print_info(self):
# print(f'这是:{self.name}')
# class aa(Muxue):
# pass
# mymuxue=aa()
# mymuxue.print_info()
# print(mymuxue.name)
#多继承
class Muxue(object):
def __init__(self):
self.name='父类'
def print_info(self):
print(f'这是:{self.name}')
class myhome(object):
def __init__(self):
self.name='my home'
def print_info(self):
print(f'这是:{self.name}')
class bb(Muxue,myhome):
pass
ss=bb()
ss.print_info()
print(ss.name)
运行结果:
这是:父类
父类
即当我们继承的类中属性和方法一样时我们默认调用的是第一个类的属性和方法。
案例二:
#父类
#单继承
# class Muxue(object):
# def __init__(self):
# self.name='父类'
# def print_info(self):
# print(f'这是:{self.name}')
# class aa(Muxue):
# pass
# mymuxue=aa()
# mymuxue.print_info()
# print(mymuxue.name)
#多继承
class Muxue(object):
def __init__(self):
self.name='父类'
def print_info(self):
print(f'这是:{self.name}')
class myhome(object):
def __init__(self):
self.name='my home'
def print_info(self):
print(f'这是:{self.name}')
class bb(Muxue,myhome):
def __init__(self):
self.name='子类'
def print_info(self):
print(f'这是:{self.name}')
ss=bb()
ss.print_info()
print(ss.name)
运行结果:
这是:子类
子类
即子类可以重写父类中的属性和方法,重写后在子类中得到的是子类中重写后的属性和方法。
3.子类使用父类中的属性和方法与查看一个类所有的父类(用魔法方法__mro__):
1.子类使用父类中的属性和方法:
#父类
#单继承
# class Muxue(object):
# def __init__(self):
# self.name='父类'
# def print_info(self):
# print(f'这是:{self.name}')
# class aa(Muxue):
# pass
# mymuxue=aa()
# mymuxue.print_info()
# print(mymuxue.name)
#多继承
class Muxue(object):
def __init__(self):
self.name='父类'
def print_info(self):
print(f'这是:{self.name}')
class myhome(object):
def __init__(self):
self.name='my home'
def print_info(self):
print(f'这是:{self.name}')
class bb(Muxue,myhome):
def __init__(self):
self.name='子类'
def print_info(self):
print(f'这是:{self.name}')
def print_Muxue(self):
Muxue.__init__(self)
Muxue.print_info(self)
def print_myhome(self):
myhome.__init__(self)
myhome.print_info(self)
ss=bb()
# ss.print_info()
# print(ss.name)
# print(bb.__mro__)
#使用Muxue类中的方法和属性
ss.print_Muxue()
ss.print_myhome()
运行结果:
这是:父类
这是:my home
2.查看一个类所有的父类:
class Muxue(object):
def __init__(self):
self.name='父类'
def print_info(self):
print(f'这是:{self.name}')
class myhome(object):
def __init__(self):
self.name='my home'
def print_info(self):
print(f'这是:{self.name}')
class bb(Muxue,myhome):
def __init__(self):
self.name='子类'
def print_info(self):
print(f'这是:{self.name}')
ss=bb()
# ss.print_info()
# print(ss.name)
print(bb.__mro__)
运行结果:
(<class '__main__.bb'>, <class '__main__.Muxue'>, <class '__main__.myhome'>, <class 'object'>)
4.多层继承:
'''
多层继承:A B(A) C(B)
'''
class A(object):
def __init__(self):
self.a='A类'
def print_a(self):
print(f'这是:{self.a}')
class B(A):
def __init__(self):
self.b='B类'
def print_b(self):
print(f'这是:{self.b}')
def print_a(self):
A.__init__(self)
A.print_a(self)
class C(B):
pass
c=C()
c.print_b()
c.print_a()
运行结果:
这是:B类
这是:A类
即多层继承不能直接跨类继承要想实现需要对子类进行重构。
5.super()方法:
有三种方法:1.用类名获得父类的方法 2.带参数的super方法 3.无参数的super方法
'''
super()方法
'''
class A(object):
def __init__(self):
self.a='A类'
def print_a(self):
print(f'这是:{self.a}')
class B(A):
def __init__(self):
self.b='B类'
def print_b(self):
print(f'这是:{self.b}')
super().__init__()
super().print_a()
class C(B):
# def __init__(self):
# self.c='C类'
def print_c(self):
# B.__init__(self)
# B.print_b(self)
# A.__init__(self)
# A.print_a(self)
# super(C,self).__init__()
# super(C, self).print_b()
super().__init__()
super().print_b()
c=C()
c.print_c()
运行结果:
这是:B类
这是:A类
6.私有权限:
'''
私有属性和方法:在属性和方法前加上两个下划线
私有属性无法继承给子类
'''
class Mxue(object):
def __init__(self):
self.name='父类'
self.__pname='私有属性'
def print_info(self):
print(f'这是:{self.name}')
print(f'这是:{self.__pname}')
def __print_p(self):
print('这是私有方法')
class aa(Mxue):
pass
bb=Mxue()
bb.__print_p()
print(bb.__pname)
mymxue=aa()
print(mymxue.name)
mymxue.print_info()
运行结果:
bb.__print_p()
AttributeError: 'Mxue' object has no attribute '__print_p'
即私有权限不能再对象中使用,但可以在非私有的方法和属性中使用。
7.获取或修改私有属性:
'''
获取和修改私有属性
get set
'''
class Mxue(object):
def __init__(self):
self.__name='私有属性'
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
aa=Mxue()
print(aa.get_name())
aa.set_name('修改后的私有属性')
print(aa.get_name())
运行结果:
私有属性
修改后的私有属性
即可以再私有属性所在的类内用类的方法来对私有属性进行修改。