13 继承和多继承,魔术方法

本文深入讲解了Python中的继承和组合概念,包括单继承、多继承的语法和使用场景,以及如何通过组合实现类的设计。同时,文章也提到了多继承的潜在问题和组合的运用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01 继承和多继承

1,继承

class A():  # 这是父亲类
    def hello(self):
        print("我是父类")


class B(A):  # 我是儿子类,继承了父类的性格
    def __init__(self):
        print("我是子类")


ss = B()  # 实例化B
ss.hello()  # 调用了父亲的类

可以看到,在定义B类的时候,括号里面加了个A,这样就写成了一个继承类,B是A的儿子,B继承了A的一切。B可以随时调用它的父亲A里面的函数。这就是继承的语法,需要注意的是,所有的类都是object的子类。

单继承和多继承:

​ 单继承:每个类只能继承一个类

​ 多继承:每个类允许继承多个类

class Fish():        #定义一个鱼类,会游泳
    def __init__(self,name):
        self.name = name
    def swim(self):
        print(self.name)
        print("我会游泳")
        
class Bird():   # 定义了一个鸟类,会飞
    def __init__(self, name):
        self.name = name

    def fly(self):
        print(self.name)
        print("我会飞")


class person():    # 定义了一个人类,会工作
    def __init__(self, name):
        self.name = name

    def work(self):
        print(self.name)
        print("我会工作")


class SuperMan(person, Bird, Fish):    # 超人,要会工作,会游泳,会飞
    def __init__(self, name):
        self.name = name


s = SuperMan("我是超人")
s.fly()
s.work()
s.swim()

print(SuperMan.mro)       # 查看所有继承关系的方法
print(SuperMan.__base__)  # 查看继承的父类  <class '__main__.person'>
print(SuperMan.__bases__)  # 查看继承的全部父类  (<class '__main__.person'>, <class '__main__.Bird'>, <class '__main__.Fish'>)

这里定义了一个超人,那么既然是超人,那就要会飞,会游泳,会做人类做的事,所以很形象的解释出了一个关于多继承的例子

只要继承了一个父亲类,那么我们可以随时调用父亲里面的函数,子类继承是有顺序的,它会按照顺序来查看。关于多继承,我们不推崇这种写法,隐患很多,一旦出了bug,那么很难找出来。

2,组合

类里面还有一种写法,叫组合

class Milk():
    def __init__(self, x):
        self.num = x


class Porridge():
    def __init__(self, x):
        self.num = x


class breakfast():
    def __init__(self, x, y):
        self.milk = Milk(x)
        self.porridge = Porridge(y)

    def name(self):
        print("我今天早餐喝了{}杯牛奶,{}碗粥".format(self.milk.num, self.porridge.num))


ss = breakfast(2,3)
# print(ss)  # <__main__.breakfast object at 0x000000000240ADA0>  直接print实例对象得到对象地址
ss.name()
#我今天早餐喝了2杯牛奶,3碗粥

这就是组合,直接把需要的类放进去实例化就可以了。

如果想扩展父类的构造函数,那么就有这个写法:

class B():
    def __init__(self, name):
        print("B")
        print(name)


class C(B):
    def __init__(self, name):
        B.__init__(self, name)  # 首先调用父类的构造函数
        print("这是C中附加的功能")  # 其次再增加自己的功能


c = C("我是C")
# B
# 我是C
# 这是C中附加的功能

--------------------------------super().f()

02 魔术方法

str__,repr,:芭蕾的实力变成字符串

__str:字符串,对用户友好,适合print输出

__repr:str备胎,如果有str,print会先执行str,eval(repr(object)) = object

call:正常情况下实例不能像函数一样被调用,要想的话可以用call

class:查看类名

03 Linux

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值