前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >填坑:多重继承和魔术方法

填坑:多重继承和魔术方法

作者头像
y191024
发布2022-09-20 18:59:32
发布2022-09-20 18:59:32
22700
代码可运行
举报
运行总次数:0
代码可运行

同时继承两个父类的结果是什么?

调用同名方法时优先继承哪一个呢?

代码语言:javascript
代码运行次数:0
复制
# 1.多重继承
class A:
    def test(self):
        print("--->A")


class B:
    def test(self):
        print("--->B")


class C(A, B):  # 同时继承A和B
    def test(self):
        print("--->C")


c = C()
c.test()  # --->C

当有同名方法时,python的探索模式是新式类的广度优先优先搜索自己类中有没有此方法 ->C->A->B

下面还有一例可以深刻感受广度优先:

代码语言:javascript
代码运行次数:0
复制
class Base:
    def test(self):
        print("---base---")

class A(Base):
    def test(self):
        print("---A---")

class B(Base):
    def test(self):
        print("---B---")

class C(Base):
    def test(self):
        print("---C---")

class D(A, B, C): # 套娃 D继承了A,B,C,A,B,C又继承了Base
    pass

# 搜索顺序:D-->A-->B-->C-->Base
# Python3用的是新式类:广度优先
d = D()
d.test()  # ---A---

由于classmethod和staticmethod我不知道具体用途是什么,暂时不写

魔术方法

__call__方法__call__()方法的作用其实是把一个类的实例化对象变成了可调用对象

代码语言:javascript
代码运行次数:0
复制
class test:

    def __init__(self ):
        print("__init__")

    def __call__(self, name, **kwargs):
        print("__call__")
        print("你的名字是{}".format(name))  # name接收传来的yft


a = test()  # 此时的a相当于对象
a("yft")  # 将对象当做是函数调用,此时打印出__call__中的内容
# 如果没有__call__方法,12行会报错,因为a不是可调用对象,而是一个实例。

__str__方法:

打印对象时就会从这个方法中打印出return的字符串数据

触发时机:当打印对象名是自动触发调用__str__里的内容

注意:一定要在__str__方法中加return,里面是打印时看到的内容。

代码语言:javascript
代码运行次数:0
复制
class test:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "姓名是:" + self.name


t = test("yft")
print(t)  # 直接打印p(对象名)会出现地址,使用__str__方法就可以
# 出现想要的信息量,也不用调用方法__str__()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 睡不着所以学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 打印对象时就会从这个方法中打印出return的字符串数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档