函数,模块与包,面向对象(super函数)

函数

内置函数+自定义函数

函数声明

def funName([*]params):
    print("function context...")
    [return 's']
    /
    pass

/

my_fun=lambda a,b:a-b

函数调用

funName(1)

funName(1,2)

print(my_fun(3,2))

模块与包

一个.py结尾的文件就是一个模块,python中有很多自带模块(标准库)和第三方模块,模块间可以引用。
包是存放模块的文件夹。3.3版本以前,文件夹中有__init__.py其他包才可以引用此包模块等。
创建包

引用
import只是不能引用包,可以引用模块,函数,变量等(可以直接使用“.”,但在用的时候也要加上完整路径名)
也可以form 包 import 模块form 模块 import 函数等form ... import *
注:from后面引入 可省略(from后面只能是包,模块)

面向对象

创建


class cat:
    # 这些都是类的属性
    name=""
    __id=0

    def __init__(self):
        # 构造器
        cat.name="波斯猫"
        cat.__id=1
        
        #这些才是对象的属性
        self.call="mie"

    def eat(self,food):
        # 共有方法(self是cat对象)
        print(cat.name+"在吃"+food)

    def run(speed):
        # 静态方法
        print(cat.name + "在以"+speed+"的速度跑,它的id是"+str(cat.__id))

使用

from study_enumerate import cat

cat.run("猫")
c= cat()
c.eat("火腿")

继承

可多继承,父类方法可重写
特:构造器
创建

class son(father):
	pass


class PersianCat(cat):
    def __init__(self): # 重写父类构造器
        # cat.__init__(self)
        super().__init__() # 调用父类构造器
        # super().name="波斯猫" # 报错
        cat.name="波斯猫"
        # super().call="miao" # 报错,'super' object has no attribute 'call'
        print(self.call) # 注释父类构造器后,'PersianCat' object has no attribute 'call'
        self.call="miao" # self是PersianCat的实例
        print(self.call)
        # 那super()是什么,它不能当cat类对象用,也不能当cat实例化对象用,只能用来调用构造器?

super函数:python内置函数
用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。(我的理解是钻石继承就是菱形继承,事实证明的确是这样)

上面说的如果不是很懂的话,就看下面讲解:
通常情况下,我们在子类中定义了和父类同名的方法,那么子类的方法就会覆盖父类的方法。而super关键字实现了对父类方法的改写(增加了功能,增加的功能写在子类中,父类方法中原来的功能得以保留)。也可以说,super关键字帮助我们实现了在子类中调用父类的方法
在这里插入图片描述
super函数深入:
MRO(Method Resolution Order):python对于每一个类都有一个MRO列表. 此表的生成有以下原则:子类永远在父类之前,如果有多个父类,那么按照它们在列表中的顺序被检查,如果下一个父类有两个合法的选择,那么就只选择第一个
例1:
super(cls, inst):
mro = inst.__class__mro()
return mro(mro.index(cls) + 1)
super做了两件事情,获取mro列表,然后返回列表中下一个类
例2:
在这里插入图片描述
输出如下:
在这里插入图片描述
super(C, self).init()
self是C的实例,这个就返回了C的MRO列表
main.C,main.B, main.A, main.Base, object

调用

persian = PersianCat()
persian.eat("西餐")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值