类与对象之动静态方法,继承,名字的查找顺序,经典类和新式类,派生方法

一:对象独有的方法

在这里插入图片描述

1.什么是对象独有的方法(函数)?
  • 我们把定义在类中的方法,看成就是对象独有的方法
2.推导过程?
class Aircraft:
    h_type = "飞行器"

    def __init__(self, name, speed):
        self.name = name
        self.speed = speed

    def can_fly(self):
        print(f'{self.name}{self.speed}光年的速度飞向亚汶四号星球')


air1 = Aircraft('西斯渗透者飞行器', 10)
air2 = Aircraft('千年隼号', 6)

air1.can_fly()  # 西斯渗透者飞行器以10光年的速度飞向亚汶四号星球
air2.can_fly()  # 千年隼号以6光年的速度飞向亚汶四号星球

在这里插入图片描述

3.总结
  • 针对对象独有的方法 我们无法真正实现
  • 1.如果在全局则不是独有的
  • 2.如果在类中则是公共的
  • python解释器针对上述问题添加了一个非常牛的特性:定义在类中的函数默认是绑定给对象的(相当于是对象独有的方法)

二:动静态方法

1.绑定给对象的方法
  • 对象调用会自动将对象当做第一个参数传入 类调用则有几个形参就传几个实参
class Animal:

    def __init__(self, a_type, voice):
        self.a_type = a_type
        self.voice = voice

    def talk(self):  # 定义给对象的方法
        print(f'{self.a_type}的声音是{self.voice}')


an1 = Animal('猫', '喵喵')

# 1.对象调用
an1.talk()  # 猫的声音是喵喵
# 2. 类调用
Animal.talk(an1)  # 猫的声音是喵喵
2.绑定给类的方法
  • 类调用会自动将类当做第一个参数传入 对象调用会自动将产生该对象的类当做第一个参数传入
class Animal:
    @classmethod
    def run(cls):  # 绑定给类的方法
        print('会跑')


an1 = Animal()

Animal.run()  # 会跑
an1.run()  # 会跑
3.静态方法(普通的函数)
  • 无论是类调用还是对象调用,有几个参数就必须传几个参数,一个都不能少
class Animal:
    @staticmethod
    def sleep(time):
        print(f'睡了{time}分钟')


an1 = Animal()

an1.sleep(3)  # 睡了3分钟
Animal.sleep(6)  # 睡了6分钟

三:面向对象三大特征之继承

什么是继承?

  • 在编程世界里继承其实就是用来描述类与类之间数据的关系,一个类继承了另一个类,也就是说它继承了该类所有的数据和功能

继承的目的?

  • 编程世界里继承就是为了节省代码编写

继承的形式

  • 单继承
  • 多继承

继承的操作

class 类名(类名):
        pass
	
	"""
	1.定义类的时候在类名后加括号
	2.括号内填写你需要继承的类名
 	3.括号内可以填写多个父类 逗号隔开即可
 	
	我们将被继承的类称之为: 父类或基类或超类
	我们将继承类的类称之为: 子类或派生类
	ps:平时最常用的就是父类和子类
	"""

继承的本质

  • 抽象:将多个类共同的数据或功能抽取出来形成一个基类
    继承:从上往下白嫖各个基类里面的资源

    对象:数据和功能的结合体
    类:多个对象相同的数据和功能的结合体
    父类:多个类相同的数据和功能的结合体

四:名字的查找顺序

1.不继承的情况下名字的查找顺序
  • 先从对象自身查找 没有的话 再去产生该对象的类中查找
class Student:
    school = '清华大学'
    def choice_course(self):
        print('正在选课')
        stu1 = Student()
        print(stu1.school)  # 对象查找school 自身名称空间没有 所以查找的是类的  清华大学
        stu1.school = '北京大学'  # 在自身的名称空间中产生了新的school
        """对象点名字并写了赋值符号和数据值 那么操作的肯定是自己的名称空间"""
        print(stu1.school)  # 北京大学
        print(Student.school)  # 清华大学
        对象	>>>
2.单继承的情况下名字的查找顺序
  • 先从对象自身查找 然后是产生该对象的类 然后是一个个父类
    class A:
        # name = 'from A'
        pass
    class B(A):
        # name = 'from B'
        pass
    class C(B):
        # name = 'from C'
        pass
    class MyClass(C):
        # name = 'from MyClass'
        pass
    obj = MyClass()
    # obj.name = '我很困!!!'
    print(obj.name)
	对象 >>>>>> 父类...
 	class A1:
    def func1(self):
        print('from A1 func1')
    def func2(self):
        print('from A1 func2')
        self.func1()  # obj.func1()
    class MyClass(A1):
        def func1(self):
            print('from MyClass func1')
    obj = MyClass()
    obj.func2()
 	'''只要涉及到对象查找名字 几乎要回到最开始的位置依次查找'''
3.多继承的情况下名字的查找顺序
  • 3.1 非菱形继承(最后不会归总到一个我们自定义类上)
    深度优先(每个分支都走到底 再切换)

  • 3.2 菱形继承(最后归总到一个我们自定义类上)
    广度优先(前面几个分支都不会走最后一个类 最后一个分支才会走)

  • 总结:主要涉及到对象查找名字 那么几乎都是 对象自身 类 父类

  • 小方法:也可以使用类点mro()方法查看该类产生的对象名字的查找顺序

五:经典类和新式类

  • 1.经典类
    不继承object或其子类的类(什么都不继承)

  • 2.新式类
    继承了object或其子类的类

  • 在python3中所有的类默认都会继承object 也就意味着python3里面只有新式类

  • 在python2中有经典类和新式类 由于经典类没有核心的功能 所以到了python3直接砍掉了

  • 以后我们在定义类的时候 如果没有想要继承的父类 一般推荐以下写法 目的是为了兼容python2

  • class MyClass(object):
            pass
    
  • 小结论:以后写代码针对object无需关心 知道它的存在即可

六:派生方法

  • 子类中定义类与父类一模一样的方法并且扩展了该功能>>>:派生
class Person:

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    def can_think(self):
        print('能思考')


class Student(Person):

    def __init__(self, name, age, gender, course):
        # Person.__init__(self, name, age, gender)
        super().__init__(name, age, gender)
        self.course = course
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值