python基础23 面向对象和类2

162 阅读5分钟

对象独有的功能

class Person:
    h_type = '人类'
    
       # 让对象拥有独有的数据,这里独有的数据就是用户的名字
    def __init__(self,name):
        self.name = name
    
       # 定义在对象里的类,称为方法
       # 是多个对象独有的公共方法,对象来调用就会将对象本身当作第一个参数传入
    def work(self):
        print('%s正在写代码'%self.name)        
    def others(self,a,b):
        print('其他人的工作完成了')


'''
针对对象独有的方法,我们无法实现:
    1.方法如果在全局里则不是独有的
    2.方法如果在设置在类中也是公共的(谁都可以调)
所以python解释器为了解决此问题:
    将定义在类中的函数默认绑定给对象(变为独有的方法)
'''

image.png

动静态方法

  • 动静态方法是专门针对写在类体代码中的函数
    • 绑定给对象的方法
      • 直接在类体代码中编写
      1.对象调用自动将对象当作第一个参数传进去
      2.类的调用有几个形参就要传入相对于的实参
      
    • 绑定给类的方法
    • 静态方法(普通的函数)
class Student:
    school = '五道口职业技术学院'

        # 绑定给对象的方法
    def run(self):   # self用于接收对象
        print('老八厕所往里跑', self)

        # 绑定给类的方法
    @classmethod
    def eat(cls):    # cls用于接收类
        print('老八吃快餐', cls)

        # 静态方法
    @staticmethod
    def sleep(a, b): # 正常接收传来的参数
        print('老八饭后要睡觉')

stu = Student()
  # 调用绑定给类的方法
stu.eat()      # 对象调用会自动将产生该对象的类当作第一个参数传进去
# 老八吃快餐 <class '__main__.Student'>
  # 调用类里的eat方法
Student.eat()  # 类调用会自动将类当做第一个参数传入  eat(Student)
# 老八吃快餐 <class '__main__.Student'>
  # 调用静态方法
Student.sleep(1, 2)
# 老八饭后要睡觉

面向对象三大特性之继承

继承

  • 面向对象有三大特性(继承,封装,多态)
  • 继承的含义:
    • 用来描述类与类之间数据的关系,类似于现实中人们说的继承家产
      • 类A继承了类B(拥有了类B里面所有的数据和功能)
  • 继承的目的:
    • 为了节省代码编写
      • 可以继承一个类,也可以继承多个类
  • 类的继承关系:
    • 被继承的类,我们称为,父类,基类或超类
    • 继承了类的类,我们称为,子类或派生类
  • 平时最常用的就是父类或者子类
  • 怎样实现继承?
class 类名1(类名2):
    pass
    
 1.定义类的时候要在类名1后面加括号
 2.括号类名2里写的是要继承的类名
 3.括号里可以继承多个父类,用逗号隔开
 4.在括号里面,从左向右查找每个父类的属性

继承的本质

  • 抽象:
    • 将多个类共同的数据或功能抽取出来形成一个基类
  • 继承:
    • 从上往下收容各个基类里的资源
  • 对象与类的区别
    • 1.对象是数据和功能的结合体
    • 2.类是多个对象相同的数据和功能的结合体
    • 3.父类是多个类相同的数据和功能的结合体
      • 类与父类主要的功能是为了节省代码

数据和方法的查找顺序

  • 不继承
    • 先从对象自身查找,没有再去产生对象的类中查找(对象>>>类)
  • 单继承
    • 先从对象自身查找,产生对象的类中查找,然后是一个个父类(对象>>>类>>>父类)
  • 多继承
    • 非菱形继承:深度优先(单个分支走到底,在切换分支走到底)
    • 菱形继承:广度优先(先走单个分支,遇到分支汇总不走,走其他分支,最后再走汇总的分支)
    • (对象>>>类>>>父类)

经典类与新式类

  • 经典类
    • 不继承object或其子类的类(什么都不继承)
  • 新式类
    • 继承了object或其子类的类
在python3中所有的类默认都会继承object
	所以3里面只有新式类
在python2中有经典类和新式类
	经典类没有核心的功能 所以到了python3没有了


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

派生方法

  • 子类中定义类与父类一模一样的方法并且扩展了功能叫做派生
  # 父类
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):   # 新加入lever
    super().__init__(name,age.gender)          # super方法专门用于子类调用父类的方法
    self.level = level                         # 自己扩展的新参数
 
 
# 案例实操
    # 给列表追加jason    # 列表也是一个类
l1 = [1, 2, 3]
l1.append('jason')
print(l1)                  # 

    # 现在有一个要求,如果是jason不能追加进列表,其他不受影响。如何完成
                         
                      no!!!!!!!!!!!!
class MyClass(list):          # 让MyClass这个类拥有所有的列表方法
    pass    
ebj = MyClass()
obj.append('tom')
obj.append('jack')
obj.append('jason')
print(obj)                   # 现在所有追加的元素都会被加进列表包括jason
    
                      yes!!!!!!!!!!!
class MyClass():
    def append(self,value):       # 此时的append方法是新定义当前局部的        
        
        # 形参value就是我们要追加的值
        # 所以我们需要调用原来的list列表的append方法
        if value == 'jason':
            print('jason不能追加')
            return                # 如果传入的参数是jason的话直接return
          
       super().append(values)  
 # 只要不追加jason其他都可以添加       
         
  • 派生图解 image.png