Python面向对象总结(三)

文章介绍了Python中的继承机制,包括单继承、多继承的原理,子类如何重写和调用父类的属性和方法,以及mro(方法解析顺序)的概念。同时讨论了私有属性的使用和访问方式,以及通过`super`调用父类方法的技巧。
摘要由CSDN通过智能技术生成

目录

继承

单继承

多继承

子类重写父类的属性和方法

继承的层级关系mro

子类调用父类的同名属性和方法1

子类调用父类重名的属性和方法二

多继承

私有属性和私有方法

获取和修改私有属性


继承

单继承

以下其实是单继承。

#先定义一个父类
class A():
    #初始化
    def __init__(self):
        self.num=10
    #自定义方法
    def info_print(self):
        print(f'父类的属性self.num={self.num}')
#子类继承父类
class B(A):
    pass
#创建对象
sun1=B()
# 子类成功继承父类
print(sun1.num)
sun1.info_print()

运行结果如下:


10
父类的属性self.num=10

Process finished with exit code 0

多继承

继承的两个父类有同名的方法或属性的话,优先选择最近的一个。

class Master():
#多继承的话,相当于是他有多个父类,但是如果父类中有自定义函数重名的话,
# 它会优先取第一个,比如classB(A,C),重名的部分就会继承A
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
class School():
    def __init__(self):
        self.kongfu='[山东煎饼果子配方]'
    def make_cake(self):
        print(f"运用{self.kongfu}制作煎饼果子")
class pretice(Master,School):
    pass
stu=pretice()#这个的话就是子承父业,但是自己有积累了一些东西,按最近来分(仅是在同名情况下)
print(stu.kongfu)
stu.make_cake()

结果如下:

[古法煎饼果子配方]
运用[古法煎饼果子配方]只做煎饼果子

子类重写父类的属性和方法

重写父类的属性和方法之后,再输出的话就是子类的属性和方法

class Master():
#多继承的话,相当于是他有多个父类,但是如果父类中有自定义函数重名的话,
# 它会优先取第一个,比如classB(A,C),重名的部分就会继承A
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
class School():
    def __init__(self):
        self.kongfu='[山东煎饼果子配方]'
    def make_cake(self):
        print(f"运用{self.kongfu}制作煎饼果子")
class pretice(Master,School):
    def __init__(self):
        self.kongfu='[独创]'
    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')

stu=pretice()#这个的话就是子承父业,但是自己有积累了一些东西,按最近来分(仅是在同名情况下)
print(stu.kongfu)
stu.make_cake()

结果如下:

[独创]
运用[独创]制作煎饼果子

继承的层级关系mro

那上面代码举例

print(pretice.mro())

结果如下 

#反应继承关系,由左到右,由近及远[<class '__main__.pretice'>, <class '__main__.Master'>, <class '__main__.School'>, <class 'object'>]

子类调用父类的同名属性和方法1

父类初始化

# 就是创建子类后,更改子类的属性值,但仍想调用父类,该如何做?方法一:
class Master():# #多继承的话,相当于是他有多个父类,但是如果父类中有重名的话,它会优先取第一个,比如classB(A,C),重名的部分就会继承A
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
class pretice(Master):
    def __init__(self):
        self.kongfu='[独创]'
    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')
    def make_oldcake(self):#要原先父类的方法
        Master.__init__(self)#父类初始化,主要是这句话
        #调用父类中make.cake方法
        Master.make_cake(self)
stu=pretice()
stu.make_cake()
stu.make_oldcake()

结果如下 

运用[独创]制作煎饼果子
运用[古法煎饼果子配方]只做煎饼果子

子类调用父类重名的属性和方法二

super()来调用父类方法

#就是创建子类偶,更改子类的属性值,但仍想调用父类,该如何做?方法二:
#两者的本质在于当涉及到多继承问题时,公共父类会重复调用,造成资源的浪费,而此方法则只会调用一次,但是多了一个school的时候就会不知道该用那个
class Master():# #多继承的话,相当于是他有多个父类,但是如果父类中有重名的话,它会优先取第一个,比如classB(A,C),重名的部分就会继承A
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
class pretice(Master):
    def __init__(self):
        self.kongfu='[独创]'
    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')
    def make_oldcake(self):#要原先父类的方法
        super().__init__()#父类初始化
        #调用父类中make.cake方法
        super().make_cake()
stu=pretice()
stu.make_cake()
stu.make_oldcake()

结果如下

运用[独创]制作煎饼果子
运用[古法煎饼果子配方]只做煎饼果子

多继承

# 又继承给一个徒弟,能继承父类中所有的方法
class Master():
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
        self.name='老师傅'
    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
class School():
    def __init__(self):
        self.kongfu='[山东煎饼果子配方]'
    def make_cake(self):
        print(f"运用{self.kongfu}制作煎饼果子")
        
class pretice(Master,School):
    def __init__(self):
        self.kongfu='[独创]'
    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')
    def make_oldcake(self):#要原先父类的方法
        Master.__init__(self)  # 父类初始化
    #调用父类中make.cake方法
        Master.make_cake(self)
    #要原先父类的方法
    def make_school(self):
        School.__init__(self)
        School.make_cake(self)
class new(pretice):
    pass
new=pretice()
new.make_cake()
new.make_oldcake()
new.make_school()
print(new.name)#没有重名的时候可以随意调用,但有时候需要修改它的值,也就是新创,这时候调用老值就需要此方法了。

结果如下:

运用[独创]制作煎饼果子
运用[古法煎饼果子配方]只做煎饼果子
运用[山东煎饼果子配方]制作煎饼果子
老师傅

私有属性和私有方法

设置需要在定义的属性和方法前加上两个下划线

class Master():
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
        self.__money=20000#私有属性

    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
class pretice(Master):
    def __init__(self):
        self.kongfu='[独创]'
    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')
    def make_oldcake(self):#要原先父类的方法
        Master.__init__(self)#父类初始化
        #调用父类中make.cake方法
        Master.make_cake(self)
stu=pretice()
print(stu.__money)#私有属性
stu.make_oldcake()

结果的话,会报错的,也就是说私有属性不能调用。

获取和修改私有属性

定义函数名get__XX和set__XX来获取和修改私有属性

####这个类里面的方法都是实例方法
class Master():
    def __init__(self):
        self.kongfu='[古法煎饼果子配方]'
        self.__money=20000#私有属性

    def make_cake(self):
        print(f'运用{self.kongfu}只做煎饼果子')
    def get_money(self):
        return self.__money#吧私有属性返回出去
    def set_money(self,money):
        self.__money=money
class pretice(Master):
    pass
stu=pretice()
a=stu.get_money()
print(a)
stu.set_money(50)
a=stu.get_money()
print(a)

结果如下

20000
50

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值