python面向对象之继承

今日内容概要

  • 动静态方法
  • 面向对象之继承理论
  • 继承的基本操作
  • 对象查找名字的顺序
    不继承
    单继承
    多继承
  • 继承的本质
  • 基于继承的派生方法(重要)

动静态方法

		在类定义的函数有多种特性
		1.类中直接定义函数 默认绑定给对象 类调用有几个参数传几个 对象调用第一个参数就是对象自身
		2.被@classmethod修饰的函数 默认绑定给类 类调用第一个参数就是类自身 对象也可以调用并且会自动将产生该对象的类当做第一个参数传入

意思是把 @staticmethod 下面的函数和所属的类截断了,这个函数就不属于这个类了,没有类的属性了,只不是还是要通过类名的方式调用  
------------


		@classmethod
			def func2(cls):
			print(嘿嘿嘿,cls)



		3.普普通通的函数,无论是类还是对象调用,都必须是手动传参

		@staticmethod
			def func3(a):
				print('哈哈哈', a)
		

		obj = Student()
		# 1.绑定给对象的方法
		# obj.func1()
		# Student.func1(123)
		# 2.绑定给类的方法
		Student.func2()  # fun2(Student)
		obj.func2()  # func2(Student)
		# 3.静态方法
		# Student.func3(123)
		# obj.func3(321)

类:
image
这张图很好的诠释了类,就是把变量和函数包装在一起。

当然我们包装也不是毫无目的的包装,我们会把同性质的包装在一个类里,这样就方便我们重复使用。

所以学到现在,你会发现很多编程的设计,都是为了我们能偷懒,重复使用。

面向对象之继承的概念

面向对象有三大特性:
封装 继承 多态
三者中继承最为核心(实操最多,体验感最强)

封装:
封装”就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体(即类);封装的目的是 增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限 来使用类的成员。。

继承:
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

多态:
它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为。


首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子

1. 继承的含义


  1. 在现实生活中继承表示人与人之间资源的从属关系
  2. 在编程世界中继承表示类与类之间资源的从属关系

2.继承的目的:


  1. 在现实生活中儿子继承父亲就拥有了父亲所有资源的支配权限
  2. 在编程世界中类A继承类B就拥有了类B中所有的数据和方法使用权限

3.继承的实操

	class Son(Father):
			pass
		1.在定义类的时候类名后面可以加括号填写其他类名 意味着继承其他类
		2.在python支持多继承 括号内填写多个类名彼此逗号隔开即可
			class Son(F1, F2, F3):
			 pass

		1.继承其他类的类	Son
			我们称之为子类、派生类
		2.被继承的类  Father F1 F2 F3
			我们称之为父类、基类、超类
		ps:我们最常用的就是子类和父类

继承的本质

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

PS:继承本质应该分为两个部分:
		抽象:将多个类相同的东西抽取出去形成一个新的类
		继承:将多个类继承刚刚抽取出来的新的类

名字的朝招顺序

1.不继承的情况下名字的查找顺序

------------

对象查找名字的顺序
        1.先从自己的名称空间中查找
        2.自己没有再去产生该对象的类中查找
        3.如果类中也没有 那么直接报错
    对象自身 >>>    产生对象的类


------------

2.单继承情况下名字的查找顺序

------------
查找自身 >>>>产生对象的类>>父类

强调:对象点名字 永远从对象自身开始一步步查找
	以后在看到self.名字的时候 一定要搞清楚self指代的是哪个对象

------------

3.多继承情况下名字的查找顺序

------------

	菱形继承
    	广度优先(最后才会找闭环的定点)
  	非菱形继承
    	深度优先(从左往右每条道走完为止)
 	ps:mro()方法可以直接获取名字的查找顺序
对象自身   >>>   产生对象的类     >>>    父类(从左往右)

经典类与新式类

"""
经典类:不继承object或者其子类的类

新式类:继承object或者其子类的类
    在python2中有经典类和新式类
    在python3中只有新式类(所有类默认都继承object)
"""
class Student(object):pass
ps:以后我们在定义类的时候 如果没有其他明确的父类 也可能习惯写object兼容

派生方法

子类基于父类某个方法做了扩展

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


class Student(Person):
    def __init__(self, name, age, gender, sid):
        super().__init__(name, age, gender)  # 子类调用父类的方法
        self.sid = sid


class Teacher(Person):
    def __init__(self, name, age, gender, level):
        super().__init__(name, age, gender)
        self.level = level


stu1 = Student('jason', 18, 'male', 666)
print(stu1.__dict__)
tea1 = Teacher('tony', 28, 'female', 99)
print(tea1.__dict__)



class MyList(list):
    def append(self, values):
        if values == 'jason':
            print('jason不能尾部追加')
            return
        super().append(values)

obj = MyList()
print(obj, type(obj))
obj.append(111)
obj.append(222)
obj.append(333)
obj.append('jason')
print(obj)

posted @ 2022-11-06 21:44  亓官扶苏  阅读(345)  评论(0)    收藏  举报