10.面向对象2

继承介绍

1 什么是继承
继承一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类\基类\超类
python中继承的特点:
1-1. 子类可以遗传/重用父类的属性
1-2. 利用继承来解决类和类之间的代码冗余问题
2 为何要用继承
减少类与类之间代码冗余
总结对象的相似之处得到了类
总结类的相似之处得到父类
3 如何用继承

class People:
    school = '图灵学院'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        
class Student(People):
    def play(self):
        print('%s play football'%self.name)
        
class Teacher(People):
    def course(self):
        print('%s course'%self.name)

# 实例化的时候子类没有__init__方法会调用父类的
stu1 = Student('周阳',30,'male')
print(stu1.__dict__)
tea1 = Teacher('大海',31,'man')
print(tea1.__dict__)

子类派生的新方法中重用父类功能的方式一

子类重用父类的功能
在子类派生出的新方法中重用父类功能的方式一:
指名道姓地引用某一个类中的函数

class People:
    school = '图灵学院'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex


class Student():	#可以不加父类名
    # 写个默认参数
    def __init__(self, name, age, sex,score=0):
    
    	**父类.函数**
        People.__init__(self,name,age,sex)
        **派生的新方法**
        self.score = score 

    def play(self):
        print('%s play football'%self.name)


class Teacher():	#可以不加父类名
    def __init__(self, name, age, sex,hobby):
    
    	**父类.函数**
        People.__init__(self, name, age, sex)
        **派生的新方法**
        self.hobby = hobby

    def course(self):
        print('%s course'%self.name)


#实例化的时候子类没有__init__方法会调用父类的
stu1 = Student('周阳',30,'male')
print(stu1.__dict__)
stu1.play()
tea1 = Teacher('大海',20,'man','篮球')
print(tea1.__dict__)

在子类派生的新方法中重用父类功能的方式二

派生实例化除了父类的属性添加,还能有自己独有的属性 ******
在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
super(自己的类名,自己的对象)
可以省略传值
super()

class People:
    school = '图灵学院'
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex


class Student(People):	#必须加父类名
    # 写个默认参数
    def __init__(self, name, age, sex,score=0):	#必须写__init__(self,参数```)
    
        # 必须要继承 Student父类的
        # super().函数名
        super().__init__(name, age, sex):	#必须写super().__init__(参数```)	
         **派生的新方法**
        self.score = score

    def play(self):
        print('%s play football'%self.name)


class Teacher(People):	#必须加父类名
    def __init__(self, name, age, sex,hobby):
      	# super().函数名
        super().__init__(name, age, sex)
        **派生的新方法**
        self.hobby = hobby
        
    def course(self):
        print('%s course'%self.name)


stu1 = Student('周阳',30,'male',99)
print(stu1.__dict__)
tea1 = Teacher('大海',20,'man','篮球')
print(tea1.__dict__)

组合

  1. 什么是组合
    组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 *****
    组合和继承的区别,继承是把全部的属性和方法让子类可以调用,而组合只是部分的属性和方法把2个类关联到一起,有些类的属性不能全部继承,这就用到了组合,组合的是对象,而继承的是,类继承是在类定义产生的,它是类之间的关联关系,而组合是类定义后产生的关系,因为它是对象的关联关系

  2. 为何要用组合
    通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起
    从而减少类与类之间代码冗余

  3. 如何用组合

     class People:
     	school = '图灵学院'
         def __init__(self,name,age,sex):
             self.name = name
             self.age = age
             self.sex = sex
             
     class Student(People):
         def __init__(self, name, age, sex,score=0):
             super().__init__(name, age, sex)
             self.score = score
             
     class Teacher(People):
         def __init__(self, name, age, sex,course = []):
             super().__init__(name, age, sex)
             self.course = course
             # print(course)
         def tell_info1(self):
             # 这个时候是列表里面装了3个课程对象
             # print(self.course)
             for i in self.course:
                 # pass
     
                 # 课程属性
                 # print('<课程名:%s,价格%s>'%(i.c_name,i.c_price))
                 # # 课程方法
                 i.tell_info()
                 # print(i)
    
     class Course:
         def __init__(self,c_name,c_price):
             self.c_name = c_name
             self.c_price = c_price
         def tell_info(self):
             print('<课程名:%s,价格%s>'%(self.c_name,self.c_price))
    
     python = Course('python开发',10000)
     math = Course('高等数学',3000)
     English = Course('英语',4000)
     music = Course('音乐',5000)
     drawing = Course('绘画',6000)
    
     tea = Teacher('大海',24,'man')
     #把music课程对象添加到老师对象tea的属性里面
     tea.course = music
     
     tea.course.tell_info()
     tea.course = math
     tea.course.tell_info()
     #如果我想把一堆的对象放到一个对象属性里面,我们怎么做?
     #思考一下? 放到一个容器里面 列表
     print(tea.course)
     tea.course.append(python)
     tea.course.append(math)
     tea.course.append(music)
     #这个时候是列表里面装了3个课程对象
     print(tea.course)
     print('========')
     tea.tell_info1()
    

多态

  1. 什么是多态 ***
    多态指的是同一种/类事物的不同形态

  2. 为何要用多态
    多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
    多态性的精髓:统一

  3. 如何用多态

     class Animal:
     	    # 动物都会叫
     	    def speak(self):
     	        print('我是动物我会说话')
    
     class People(Animal):
         def speak(self):
             print('say hello')
    
     class Dog(Animal):
         def speak(self):
             print('汪汪汪')
    
     class Pig(Animal):
         def speak(self):
             print('哼哼哼')
             
     # 三个对象都是动物
     obj1=People()
     obj2=Dog()
     obj3=Pig()
     # 多态性的精髓:统一
     obj1.speak()
     obj2.speak()
     obj3.speak()
    

常用的魔法方法

str: 在对象被打印时自动触发,可以用来定义对象被打印时的输出信息(主动技能)
del 在对象被删除时先自动触发该方法,可以用来回收对象以外其他相关资源,比如系统资源
call: 在对象被调用时会自动触发该方法(被动技能)
用法:
str(self):

class People:
	def __init__(self,name,age):
		self.name = name
		self.age = age
	def __str__(self):
		return '<name:%s age%s>'%(self.name,self.age)
obj = People('大海',18)
print(obj)

del(self):

class Foo:
	def __init__(self,x,filepath,encoding = 'utf-8'):
		self.x = x
		self.f = open(filepath,'rt',encoding=encoding)
	def __del__(self):
		print('__del__正在运行')
		self.f.close()
		
obj = Foo(1,'a.txt')
obj.f.read()
print('不是对象生成运行__del__,对象正在使用的时候不会运行')

call(self):

class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __call__(self, *args, **kwargs):
        print(self,args,kwargs)
    def run(self):
        print('run')
obj1 = Foo(1,2)
obj1.run()
obj1()
obj1(1,2,x=3,y=4)
省略了
obj1.__call__(1,2,x=3,y=4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值