python继承,多态


        继承是指一个对象直接使用另一对象的属性和方法。也指按照法律或遵照遗嘱接受死者的财产、职务、头衔、地位等。

继承

继承两个爸爸

代码:

# 真爸爸--穷
class TrueFather:
    money = 1000
    __privateMoney = 0

    def fanc(self):
        print('虽然没钱,但我会开汽车!')


# 假爸爸---有钱有银行
class PhonyFather:
    money = 1000000
    __privateMoney = "a bank"  # 私有属性,有银行,不能直接访问

    def fanc(self):
        print("不但有钱,还会开飞机!")

    def present(self):
        # 假爸爸看到真爸爸太穷了,就给了他10000元
        TrueFather.money += 10000
        return TrueFather.money

    def getPrivate(self):
        return self.__privateMoney


class Son(TrueFather, PhonyFather):
    # Son继承了两个爸爸,但是如果两个爸爸中的属性相同,他只能继承左边第一个父类,不能继承右边的父类.
    # 但如果两个父类的属性不同,就可以全部继承
    def fanc(self):
        # 覆写属性
        print("我还小,不让开汽车,也不让开飞机!")


bob = Son()  # 实例化Son对象bob
print("我继承的钱:")
print(bob.money)  # 因为两个父类的monoy属性相同所以只继承第一个爸爸的钱

print("因为太少了,不够花,我问假爸爸要了点,总共:")
print(bob.present())  # 因为第一个父类没有present属性,所以继承第二个父类(假爸爸),查看继承的假爸爸的属性
bob.fanc()  # 调用覆写的属性
print("*" * 50)
# __privateMoney   #私有属性不能访问,想访问有两种方法
# 方法一:不用调用函数。
father = TrueFather()  # 实例化真父类
print("真爸爸的私有钱财:")
print(father._TrueFather__privateMoney)
print("*" * 50)
# 方法二:写方法getPrivate,调用函数查看假爸爸的私有属性
print("假爸爸的私有钱财:")
print(bob.getPrivate())

结果如下,故事情节自由发挥

我继承的钱:
1000
因为太少了,不够花,我问假爸爸要了点,总共:
11000
我还小,不让开汽车,也不让开飞机!
**************************************************
真爸爸的私有钱财:
0
**************************************************
假爸爸的私有钱财:
a bank

进程已结束,退出代码 0

这个函数里面的变量随着初始化对象,自动运行,可以用作初始化。

def __init__(self):、
	self.name = ' '
	self.age = '20'
	print("里面的内容随着代码运行,不用调用,直接运行,相当于初始化")

多个子类调用公共父类

新式类与经典类

在Python 3.x中取消了经典类,默认都是新式类,并且不必显式的继承object,也就是说:
class Person(object):pass
class Person():pass
class Person:pass
三种写法并无区别

但是在Python2.x中,默认都是经典类,只有显式继承了object才是新式类,即:
class Person(object):pass 新式类写法
class Person():pass 经典类写法
class Person:pass 经典类写法

只是继承搜索的顺序发生了变化
详细点击链接

经典类

class A:
    def __init__(self):
        print("进入A")
        print("离开A")


class B(A):
    #继承A
    def __init__(self):
        print("进入B")
        A.__init__(self)
        print("离开B")


class C(A):
    # 继承A
    def __init__(self):
        print("进入C")
        A.__init__(self)
        print("离开C")

class D(B, C):
    def __init__(self):
        print("进入D")
        B.__init__(self)
        C.__init__(self)
        print("离开D")
d = D()

结果,调用顺序是从左开始,深入根部.(深度优先)

进入D
进入B
进入A
离开A
离开B
进入C
进入A
离开A
离开C
离开D

在这里插入图片描述

改进super函数

代码

class A:
    def __init__(self):
        print("enter A")
        print("leave A")

class B(A):
    def __init__(self):
        print("enter B")
        super().__init__()
        print("leave B")

class C(A):
    def __init__(self):
        print("enter C")
        super().__init__()
        print("leave C")

class D(B,C):
    def __init__(self):
        print("enter D")
        B.__init__(self)
        C.__init__(self)
        print("leave D")

d=D()

结果:进入b,进入c,(广度优先)

enter D
enter B
enter C
enter A
leave A
leave C
leave B
enter C
enter A
leave A
leave C
leave D

继承传参

代码:

#乌龟
class Turtle():
    def __init__(self, x):
        self.num = x

#鱼
class Fish():
    def __init__(self, y):
        self.num = y

#池塘
class Pool():
    def __init__(self, x, y):
        self.turtle = Turtle(x)
        self.fish = Fish(y)

    def print_num(self):
        print("乌龟%d只! 鱼%d条!" % (self.turtle.num, self.fish.num))


p = Pool(3, 5)#初始化对象,传参数
p.print_num()

结果

乌龟3只! 鱼5条!

进程已结束,退出代码 0

多态

        多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
        多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。
        多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

多态求图形面积

代码

class Triangle:
    # 三角形长宽,面积
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def getArea(self):
        area = self.width * self.height / 2
        return area


class Square(Triangle):
    # 正方形边长,面积
    def __init__(self, size):
        self.size = size

    def getArea(self):
        area = self.size * self.size
        return area


def fanc(its):
    area = its.getArea()
    print("面积为" + str(area))


a = Triangle(5, 5)
# print(a.getArea())
b = Square(5)
# print(b.getArea())

# 不同对象调用同一个函数,出现不同结果就是多态。
fanc(a)
fanc(b)

结果

面积为12.5
面积为25

进程已结束,退出代码 0

其实python, print本身就是一种多态
当你
print(1+1)//计算得2
print(‘a’+‘a’)//拼接得aa

------------------------------------------------------------------------
谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值