day28 Pyhton 面向对象 继承
1.昨日回顾
类的命名空间
静态属性\动态属性(方法)
对象的命名空间
#对象的属性
#类指针:对象能够通过这个类指针找到类
#静态属性:属于类,多个对象共享这个资源
#尽量用类名来操作静态属性
#对象操作静态属性:
#只要是给'对象.属性名'赋值就相当于新建对象属性,而不是修改静态属性
#组合
#两个类的对象
#其中一个对象的属性是另一个对象
# class Course:
# def __init__(self,name,price,period):
# self.name = name
# self.price = price
# self.period = period
# class Student:
# def __init__(self,name,sex,age,course_obj): # course_obj = python
# self.name = name
# self.sex = sex
# self.age = age
# self.course = course_obj # self.course = course_obj = python
# python = Course('python',19800,'6 months')
# qi = Student('齐轸棠','女',18,python)
# bu = Student('卜鑫杰','男',30,python)
# print(qi.course.name)
# print(bu.course.name)
# python.name = 'python2.0'
# print(qi.course.name)
# print(bu.course.name)
2.今日内容
(1)
#什么是函数,什么是方法
从定义的角度上看,我们知道函数(function)就相当于一个数学公式,它理论上不与其它东西关系,它只需要相关的参数就可以。所以普通的在module中定义的称谓函数是很有道理的。
那么方法的意思就很明确了,它是与某个对象相互关联的,也就是说它的实现与某个对象有关联关系。这就是方法。虽然它的定义方式和函数是一样的。也就是说,在Class定义的函数就是方法。
方法和函数其实是一样的,只是不同语言的不同表述形式。一般来说,面向过程的语言会使用“函数”来描述,面向对象的语言会用“方法”来描述。
# 从程序的角度上也是可以判断的
# from types import MethodType, FunctionType
# print(isinstance(a.func,MethodType))
# print(isinstance(A.func,MethodType))
# print(isinstance(a.func,FunctionType))
# print(isinstance(A.func,FunctionType)
# pickle 游戏人物的状态的保存(存档读档)
import pickle # python
# pickle模块可以序列化python中的所有自定义类的对象
# class Course:
# def __init__(self,name,price,period):
# self.name = name
# self.price = price
# self.period = period
# class Student:
# def __init__(self,name,price,period):
# self.name = name
# self.price = price
# self.period = period
# python = Course('python',19800,'6 months')
# linux = Course('python',19800,'6 months')
# with open('courses','wb') as f:
# pickle.dump(python,f)
# with open('courses','rb') as f:
# Course = pickle.load(f)
# print(Course)
# 如果load一个对象,那么这个对象所对应的类必须已经在内存中
# 同一个类的对象 会存储在同一个文件中
(2)
# 面向对象的三大特性
# 继承
# 多态
# 封装
# 所有的面向对象的语言 三大特性 通用的
# 猫类 : 名字,品种,吃饭\喝水\叫(喵喵)\会爬树的
# 狗类 : 名字,品种,吃饭\喝水\叫(旺旺)\看家的
# class Cat:
# def __init__(self,name,kind):
# self.name = name
# self.kind = kind
# def eat(self):
# print('%s is eating'%self.name)
# def drink(self):
# print('%s is drinking'%self.name)
# def yell(self):
# print('%s is yelling'%self.name)
# def climb(self):
# print('%s can climb'%self.name)
#
# class Dog:
# def __init__(self,name,kind):
# self.name = name
# self.kind = kind
# def eat(self):
# print('%s is eating'%self.name)
# def drink(self):
# print('%s is drinking'%self.name)
# def yell(self):
# print('%s say miaomiao'%self.name)
# def lookafter_door(self):
# print('%s can look after door'%self.name)
# 继承 : 就是为了解决类与类之间代码重复的问题的
# 类的继承的语法:
# 单继承
# class A:pass
# class B(A):pass
# print(B.__bases__)
# 在定义类的时候加(),括号写的类就是继承的类
# B类继承A类
# A类 : 父类 基类 超类
# B类 : 子类 派生类 # 多继承(python支持 java不支持)
# class C:pass
# class D:pass
# class E(C,D):pass
# print(E.__bases__)
# E继承C,D
# C,D都是父类
# E是子类
# 子类可以继承父类的方法和属性
# 实例化的执行流程:
# 先开辟一块空间,并且空间中已经有了一个类指针,指向Cat
# 执行__init__方法,在Cat类的空间中没有init方法,找Animal类中的init
# 将空间返回给小花变量
# 继承
# 子类调用方法,如果子类自己有用自己的,用了自己的就不用父类的了
# 如果子类自己没有才调用父类的
# 继承
# 子类调用方法,如果子类自己有用自己的,用了自己的就不用父类的了
# 如果子类自己没有才调用父类的
# 如果子类有个性化的父类没有的方法,可以单独定义在子类中 - 派生方法
# 只有子类能够使用父类中的方法,父类不可以使用子类中的方法
# class Animal:
# def __init__(self,name,kind,language):
# self.name = name
# self.kind = kind
# self.language = language
# def eat(self):
# print('%s is eating'%self.name)
# def drink(self):
# print('%s is drinking'%self.name)
# def yell(self):
# print('%s say %s'%(self.name,self.language))
# def sleep(self):
# print('%s 在睡觉'%self.name)
# class Cat(Animal):
# def climb(self): # 派生方法
# print('%s can climb'%self.name)
# def sleep(self):
# #1. Animal.sleep(self) # 父类名,主动传self
# # super(self,Cat).sleep() # 过程 super(self,子类名).方法名()
# #2. super().sleep() # super().方法名()
# print('团着睡')
# class Dog(Animal): # 派生方法
# def lookafter_door(self):
# print('%s can look after door'%self.name)
#
# 小花 = Cat('小花','金吉拉','喵喵')
# 小花.sleep() # 既希望走父类的基础的sleep,又希望走自己的方法
当某一个方法,父类和子类都拥有的时候,那么在子类的方法中,调用父类的同名方法
# 1.父类名.方法名(self,...)
# 2.super().sleep(...)
class Animal:
def __init__(self,name,hp,ad):
self.name = name
self.hp = hp
self.ad = ad
class Person(Animal):
def __init__(self,name,sex,hp,mp,ad):
super().__init__(name,hp,ad)
self.sex = sex # 派生属性
self.mp = mp # 派生属性 def attack(self,dog):
print('%s攻击了%s'%(self.name,dog.name))
dog.hp -= self.ad class Dog(Animal):
def __init__(self,name,kind,hp,ad):
super().__init__(name,hp,ad)
self.kind = kind # 派生属性 def bite(self,person):
print('%s咬了%s'%(self.name,person.name))
person.hp -= self.ad alex = Person('alex','不详',10,10,0.1)
hei = Dog('小黑','中华田园犬',999,1.1)
print(hei.__dict__)
# 继承
# 两种语法:
# 单继承
# 多继承
# 几个基础概念
# 父类 : 超类 基类
# 子类 : 派生类
# 为什么要继承 : 几个类之间有重复的属性/方法 ,就把相同的属性和方法抽象出来,作为父类,子类去继承父类
# 父类和子类之间的关系 : 子类关联父类,父类并不关联子类
# 子类使用父类的方法
# 子类中有,父类中没有 : 用子类的
# 父类中有,子类中没有 : 用父类的
# 子类\父类中都有 : 默认情况下用子类的不用父类的
# 既想用父类又想用子类 : 父类名.方法名(子类对象),super().方法名()
# 子类\父类中都没有 : 报错
day28 Pyhton 面向对象 继承的更多相关文章
- day30 Pyhton 面向对象 继承.装饰器
一面向对象相关 谈谈你对面向对象的理解 1.泛泛谈:什么情况下使用面向对象 2.针对面向对象的 封装 继承 多态一个一个的谈 3.根据你工作中的实际情况对应来举例子 封装 1.广义上:普遍的大家认为的 ...
- day29 Pyhton 面向对象 继承进阶
一.内容回顾 初识继承 父类\基类\超类 子类\派生类 派生 :派生方法.派生属性 单继承 继承的语法class子类名(父类名) 解决开发中代码冗余的问题 子类继承了父类之后,可以调用父类中的方法 如 ...
- OC面向对象—继承
OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...
- 面向对象继承实例(a如何继承b)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js面向对象继承
前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...
- Php面向对象 – 继承和重写
Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public $p_c ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- Java面向对象 继承(上)
Java面向对象 继承 知识概要: (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...
- js高级-面向对象继承
一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...
随机推荐
- leetcode刷题-55跳跃游戏
题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 思路 贪心算法:记录每一个位置能够跳跃到的最远距离,如果 ...
- Java使用数据库连接池连接Oracle数据库
第一步:导入tomcat\lib 下的一个tomcat-dbcp.jar包第二步:在web\META-INF下新建一个context.xml文件,文件内容如下: <?xml version=&q ...
- 深入理解 vue 中 scoped 样式作用域的规则
哈喽!大家好!我是木瓜太香,今天我们来聊一个 vue 的样式作用域的问题,通常我们开发项目的时候是要在 style 上加上 scoped 来起到规定组件作用域的效果的,所以了解他们的规则也是很有必要的 ...
- 微信小程序-组件-视图容器
1.view 1.作用:类似 html 的 div 用来进行页面布局,具有块级盒子特性. 2.常用属性:设置view盒子点击后的状态,以及控制是否影响父盒子的点击状态 3.eg:<view ho ...
- [LeetCode]67. 二进制求和(字符串)(数学)
题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 题解 两个字符串从低位开始加,前面位不够补0.维护进位,最后加上最后一个进位,最后反转结果字 ...
- GitHub常用上传文件的两种方法 附带常见的问题及Git安装教程
从早上下课到现在一直在琢磨如何给Github下载本地文件,中午饭都没吃.还好是解决了,感觉挺有成就感的.O(∩_∩)O哈哈~ 好哒 闲话不说,说重点. 一.git的安装 百度云:http://pan. ...
- Tomcat 第二篇:启动流程
1 Tomcat 基本知识 首先介绍一些 Tomcat 的基本知识,防止有纯小白看的云里雾里的. 下面这张图是一个下载好二进制版的的 Tomcat ,直接解压得到的,虽然版本是 9.x ,但是这个目录 ...
- TensorFlow之张量
张量的概念 TensorFlow中的Tensor就是张量,张量是数学对象,是对标量.向量.矩阵的泛化.我们可以直接理解成张量就是列表,就是多维数组. 张量的维数用阶来表示: 0阶张量 标量 单个值 例 ...
- Powershell编程基础-001-基本语法
变量的定义:$a="abc" 变量的引用也是echo $a 注释: 1.单行注释:单行注释是在每行的开头键入井号#的注释. #符号右边的所有内容都将被忽略,也可以在 ...
- lombok使用(给自己看的,只为不要忘记自己用过的技术)
如何使用? 一.1)eclipse使用方法 1. 从项目首页下载lombok.jar 2. 双击lombok.jar, 将其安装到eclipse中(该项目需要jdk1.6+的环境) 2)idea使用方 ...