python 继承 面向对象三大特性 类属性和实例属性 类方法和静态方法

目录

继承

单继承

多继承

子类重写父类同名方法和属性

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

super()调用父类方法

私有权限

获取和修改私有属性值

面向对象三大特性:

多态

类属性和实例属性

类属性

修改类属性

类方法和静态方法

类方法

静态方法


继承

继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。

在python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。

单继承

一个类继承一个父类

多继承

一个类同时继承了多个父类

注:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法

子类重写父类同名方法和属性

如果子类重写父类拥有的同名属性和方法,子类创建对象调用属性和方法的时候,调用到的是子类里面的同名属性和方法。

类. _mro_:表明该类的继承关系

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

class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')

class School(object):
    def __init__(self):
        self.kongfu = '[黑马煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')

class Prentice(School, Master):
    def __init__(self):
        self.kongfu = '[独创煎饼果子技术]'

    def make_cake(self):
        self.__init__()
        print(f'运用{self.kongfu}制作煎饼果子')

    #子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
    def make_master_cake(self):
        #父类.函数()
        #再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用
        #如果定义的类名修改,这里也要修改。麻烦:代码量庞大,冗余
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)

tudi = Prentice()

tudi.make_cake()
# print(Prentice.__mro__)
tudi.make_master_cake()
tudi.make_school_cake()
tudi.make_cake()
"""
运用[独创煎饼果子技术]制作煎饼果子
运用[古法煎饼果子配方]制作煎饼果子
运用[黑马煎饼果子配方]制作煎饼果子
运用[独创煎饼果子技术]制作煎饼果子
"""

super()调用父类方法

语法1:

super(当前类名,self).函数()

语法2:

super().函数()

注:使用super()可以自动查找父类。调用顺序遵循_mro_类属性的顺序。比较适合单继承使用

私有权限

可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。

设置私有权限的方法:在属性名和方法名前面加上两个下划线__。

语法:

class 类名():

        #私有属性

        __属性名 = 值

        #私有方法

        def __函数名(self):

                代码

获取和修改私有属性值

在python种一般定义函数名为get_xx用来获取私有属性,定义set_xx用来修改私有属性值

面向对象三大特性:

1.封装

①将属性和方法书写到类的里面的操作即为封装

②封装可以为属性和方法添加私有权限

2.继承

①子类默认继承父类的所有方法和属性

②子类可以重写父类属性和方法

3.多态

①传入不同的对象,产生不同的结果

多态

定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同执行结果

好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化。

实现步骤:

①定义父类,并提供公共方法

②定义子类,并重写父类方法

③传递子类对象给调用者,可以看到不同子类执行效果不同

类属性和实例属性

类属性

类属性:就是类对象所拥有的属性,它被该类的所有实例对象所共有

类属性可以使用类对象实例对象访问

优点:

①记录的某项数据始终保持一致时,则定义类属性

②实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。

修改类属性

类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。

语法:

类.类属性

类方法和静态方法

类方法

语法:

@classmethod

def info_print():
        代码

特点:类方法需要用装饰器 @classmethod 来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls 作为第一个参数

使用场景:

①当方法中需要使用类对象(如获取私有类属性等)时,定义类方法

②类方法一般和类属性配合使用

静态方法

语法:

@staticmethod
def info_print():
        代码

特点:

①需要通过装饰器@staticmethod 来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)

②静态方法也能够通过实例对象去访问

使用场景:

①当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性,类方法,创建实例等)时,定义静态方法

取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值