python--继承+多继承+类方法+实例方法

python--继承+多继承+类方法+实例方法

继承

子类调用父类的方法:

self.方法名称()【在子类里面】

类实例.方法名称()【在子类外面】

super():用来调用父类的方法

python 复制代码
class Test01:
    def __init__(self):
        pass

    # 定义一个公共方法 test01
    def test01(self):
        print('Test01 >>> test01')

    # 定义一个私有方法 __test02
    def __test02(self):
        self.test01()
        print('Test01 >>> test02')
# 定义一个继承自 Test01 的类 Test02
class Test02(Test01):
    # 定义一个公共方法 test03
    def test03(self):
        print('Test02 >>> test03')
        # 调用父类 Test01 的公共方法 test01
        self.test01()

if __name__ == '__main__':
    # 实例化 Test02 类的对象 a
    a=Test02()
    # 调用 a 的 test03 方法
    a.test03()

单继承

python 复制代码
class A:
    def foo(self):
        print("father foo")

class B(A):
    pass
#实例化B对象b
b = B()
#调用b.foo()方法,输出"father foo
b.foo()  # father foo

多继承

普通多继承

python 复制代码
# 案例一、普通多继承
class A:
    def foo(self):
        print(A)

class B:
    def foo(self):
        print(B)

class C(A):
    pass

class D(B):
    pass

# 继承顺序似乎和C、D的顺序有关,要是改成 class E(D, C), 继承顺序又会不一样
class E(C, D):
    pass

e = E()
e.foo() 
# A

# mro() 或 __mro__ 可以查看继承顺序
print(E.mro()) 
# [<class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.D'>, <class '__main__.B'>, <class 'object'>]
# 即继承顺序是:E->C->A->D->B

菱形多继承

python 复制代码
# 案例二、菱形结构继承
class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(C,B):
    pass

print(D.mro())
# [<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
# 即继承顺序是:D->C->B->A
# 说明python的继承不完全是深度优先算法实现,而是采用 C3算法+DFS算法(深度优先)

super关键字

super():用来调用父类的方法

python 复制代码
class A:
    def __init__(self):
        print("A")

class B(A):
    def __init__(self):
        print("B")
        super().__init__()
        
b = B()

# [输出]:
# B
# A

方法

实例方法

定义在类中,第一个参数【实例对象】,习惯用self来表示他

self:类实例

调用:实例.方法名()

类方法

定义在类中,通过 @classmethod修饰之后,他就是类方法,第一个参数是类本身,习惯上使用cls来占位,注意与self 的区别

cls:类本身

调用:类名称.类方法() Test01.test02()

类实例.类方法() Test01().test02()

静态方法

定义在类中,通过 @staticmethod修饰后,他就是静态方法,参数可以随便,没有self,cls (类和类实例)

调用:

类名称.类方法() Test01.test03()

类实例.类方法() Test01().test03()

类方法 和 静态方法区别

相同点:

都是挂在类下面,可以通过类直接调用

他们都可以被实例调用

不同点:

类方法可以使用类的属性,和静态方法

静态方法:不可以使用类的属性和方法

使用场景:

当你的类不能重复初始化的时候,就可以使用类方法或者实例方法

装饰器

定义装饰器

python 复制代码
# 它通过将函数func包装在一个新的函数中来修改其行为
def decorator(func):
    # 定义一个新的函数,该函数将被返回
    def wrapper(*args, **kargs):
        # 打印被装饰的函数的名称
        print(func.__name__)
        # 返回被装饰的函数的调用结果
        return func(*args, **kargs)

    # 返回修改后的函数
    return wrapper

使用装饰器

使用方法1

f = decorator(函数名) # 装饰器不传入参数时

f = (decorator(参数))(函数名) # 装饰器传入参数时

f() # 执行被装饰过的函数
使用方法2

@decorator # 已定义的装饰器

def f(): # 自定义函数

pass

f() # 执行被装饰过的函数

python 复制代码
# 使用
@decorator
def function_to_be_decorated():
    print("Hello, this is the function to be decorated!")


# 调用被装饰的函数
function_to_be_decorated()

自身不传入参数的装饰器

python 复制代码
def login(func):
    def wrapper(*args, **kargs):
        # 打印函数名
        print('函数名:%s' % func.__name__)
        # 调用被装饰的函数
        return func(*args, **kargs)

    return wrapper


@login
def f():
    # 打印函数本身
    print('inside decorator!')

# 调用被装饰的函数
f()

# 输出:
# 函数名:f
# 函数本身:inside decorator!

自身传入参数的装饰器

python 复制代码
def login(text):
    # 定义一个装饰器,接受一个字符串作为参数
    def decorator(func):
        # 定义一个装饰器函数,接受一个函数作为参数
        def wrapper(*args,**kargs):
            # 打印登录信息和函数名称
            print('%s----%s'%(text, func.__name__))
            # 调用原始函数并返回结果
            return func(*args,**kargs)

        # 返回装饰器函数
        return wrapper

    # 返回装饰器
    return decorator

@login('this is a parameter of decorator')  # 等价于 ==> (login(text))(f) ==> 返回 wrapper
def f():
    print('2019-06-13')

f() # 等价于 ==> (login(text))(f)() ==> 调用 wrapper() 并返回 f()

# 输出:
# this is a parameter of decorator----f
# 2019-06-13
相关推荐
15Moonlight14 分钟前
C++ 入门
开发语言·c++
追寻向上25 分钟前
《JMeter自动化测试实战指南:从环境搭建到Python集成(进阶篇)》
开发语言·python·jmeter
Start_Present27 分钟前
Pytorch 第十回:卷积神经网络——DenseNet模型
pytorch·python·深度学习·神经网络·分类·cnn
沉到海底去吧Go37 分钟前
图片OCR多区域识别并重命名图片文件,基于Python和阿里云的实现方案
python·阿里云·云计算·ocr·pdf信息提取到表格·多个区域内容提取信息到表格·批量pdf多个区域内容保存表格
SsummerC39 分钟前
【leetcode100】组合总和
数据结构·python·算法·leetcode
恋恋风辰3 小时前
QT系列教程(16) 定时器事件
开发语言·qt·命令模式
LitchiCheng5 小时前
OpenCV 拆分、合并图像通道方法及复现
python·opencv·计算机视觉
Wiktok6 小时前
基于ThinkPHP6用户登录逻辑,结合FastAPI框架实现用户登录系统的全流程解析
python·fastapi
WIN赢7 小时前
【性能测试入门_01性能测试jmeter基础实操场景详解】
ide·python·pycharm