面向对象(二)

面向对象(二)

昨日回顾

对象概念:数据与功能的组合可以被称为对象

面向过程编程:根据功能编写代码

面向对线编程:根据特点对象编写特定代码

类与对象的概念:拥有相同功能的群体就叫做类,根据对象的抽象概念,类也是个对象

代码定义类:

​ 语法结构

class 类名:
		公共的数据
		公共的功能

代码产生对象:

​ 类名加括号产生,这个过程我们称之为实例化

对象 = 类名()
对象1 = 类名()

​ 类产生的多个对象都可以访问到类中公共的数据和功能

对象独有的数据

对象.__init__['属性'] = '值'
因为其内部好似一个字典

绑定方法

所以类中定义的函数第一个形参会自动帮你写self
你传入的第一个参数,就默认会作为该字典的k值
  class 类名:
      def __init__(self, 属性):
        对象.属性 = 值
      def func(self):
        pass
      def index(self):
        pass

今日学习内容

动态方法与静态方法

动态方法

第一种就是我们昨天学过的
1.绑定给对象
class 类名:
  def 对象(self):
    调用对象

类调用绑定给对象,传参,有几个就传几个参数
类名.对象(1,2,3)
对象调用绑定给对象的方法,会将对象当做第一个参数传入
对象1.对象()

2.绑定给类的方法
class 类名:
  @classmethod
  def 对象(cls):
    调用对象
    
 类调用绑定给类的方法:会自动将类当做第一个参数传入
print(类名)  
类名.对象()		结果相同

对象调用绑定给类的方法:不需要传参,会将产生该对象的类自动当做第一个参数传入
对象1.对象()	结果相同

静态方法

class 类名:
    	@staticmethod
      def 对象(a):
          print(a)
	1.普普通通的函数:无论谁来调 都必须传固定的参数个数
    # 类调用静态方法:要自己传值
    类名.对象(对应的参数)
    # 对象调用静态方法:要自己传值
    对象1.对象(对应的参数)

面向对象三大特性

继承 封装 多态

其中封装和多态更多的表现是一种概念

继承就更变相与实用性

继承的概念

现实生活中:

​ 一切从他人获取的原不属于自己或者自己不拥有的资源,精神都可以算作继承

​ 西撒:继承我最后的波纹吧!

面向对象中

​ 继承原不不属于该类的功能或数据,通过继承的方法去获取。

​ 例子:类A原不不拥有a的值,类b中有a = 1,类A继承类B后,类A就可以调用这个a = 1

继承的意义

​ 现实生活中:物质方面接收馈赠,以更小的付出去完成想要的事物。精神层面获得传承,实现被继承者的目标。

​ 面向对象中:减少代码冗余,提高开发效率,提升代码上限。

​ 例子:类A可以继承类B的功能数据,同时也可以继承类C的功能和数据,继承的数量不受限制。

继承的基本使用

class A(B)
	pass
被继承的类:父类,基类     	  B
继承者的类:子类,派生类			 A

继承的本质

减少已有过的资源消耗,直接分享其结果

简单来说,就是为了减少不必要的代码冗余,结束代码量,提高工作上限。

对象:数据与功能的结合体
类:多个具有相同功能的对象的与他们公有的功能的结合体
父类:多个类于其功能的结合体

class Person:  # 定义一个类
    def __init__(self, name, age, gender):  # 使用双下init方法定义需要接收的参数
        self.name = name  # 用self的变量名name接受传入的形参
        self.age = age
        self.gender = gender
class Teacher(Person):  # 子类继承父类
    def teach(self):  # 定义函数
        print(f'{self.name}老师正在讲课')  # 调用父类的参数
class Student(Person):  # 子类继承父类
    def study(self):  # 定义函数
        print(f'{self.name}学生正在学习')  # 调用父类中的参数

名字的查找顺序

在不继承的情况下

​ 先从对象自己的名称空间中查找,没有则去类里面的名称空间查找

graph LR 对象-->类

单继承的情况下

graph LR 对象-->类-->父类

​ 经典案例

  	class A:  # 定义一个类
      def f1(self):  # 定义A类的功能,f1函数
          print('from A.f1')
      def f2(self):  # 定义A类的功能,f2函数
          print('from A.f2')  # 定义f2类的功能
          self.f1()	 # 运行f1函数
    class MyClass(A):  # 继承A类
       def f1(self):  # 自己定义一个f1的函数
            print('from MyClass.f1')  # f1的功能
    obj = MyClass()  # 实例化
    obj.f2()  # 调用f2函数
    
    他的运行路线为
    1.在对象名称空间中没有找到
    2.在类的名称空间中没有找到
    3.在父类A的名称空间中找到了
    4.运行f2,先打印'from A.f2'
    5.运行self.f1()
    6.因为第一次传参self是MyClass()
    7.运行f1,打印'from MyClass.f1'

多继承的情况下

Python2与python3的小差距

在python2中,存在经典类,表示该定义的类中不包含内置的(object)

这个object中代表了很多种方法,而python中需要调用这个object

则需要:

将他转成新式类

class MyClass(object):
        pass

而python3中只存在新式类。自动添加object

深度优先:一直接找到最后的父类

广度优先:优先走完所有的子类,最后找到父类

派生类

派生类就是子类,子类可以基于父类的功能或数据,增添属于自己的功能或数据

class Person:
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
        
class Teacher(Person):
    def __init__(self,name,age,gender,level,salary):  # 调用了父类以外的参数
        super().__init__(name,age,gender)  # 获取父类中拥有的参数
        self.level = level  # 重新自己增加需要的参数
        self.salary = salary

派生功能前瞻

class MyClass(list):  # 调用list父类
    def append(self,args):  # 重写父类中append内置方法
        if args == 123:  # 进行判断
            print('数字123不能追加')  # 打印 
            return  # 直接结束函数
        super(MyClass, self).append(args)  # 否则执行原来内置方法
obj1 = MyClass()
obj1.append(333)
obj1.append(222)
obj1.append(123)
print(obj1)

小结

搞明白了,最后这个派生功能很有意思,可以决定我是否需要使用本身的内置方法。

posted @ 2022-04-07 20:56  Eason辰  阅读(32)  评论(0)    收藏  举报