python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一、课前回顾
类:具有相同属性和方法的一类事物
实例化:类名()
过程:
开辟了一块内存空间
执行init方法
封装属性
自动的把self返回给实例化对象的地方
对象:实例
一个实实在在存在的实体
组合:
一个类的对象 作为另一个类对象的属性
让两个类之间产生关系
__dict__():
查看类中所有静态属性和方法
查看所有对象的属性、类对象指针
静态属性:类的属性,所有的对象共享这个变量
对象名:去修改 类的静态属性
在对象的空间中有创建了一个属性,而不能修改类中属性的值
操作静态属性 应该 用类名来操作
二、面向对象的三大特性之继承
2.1继承与抽象两个概念
class Animal: # 父类/超类/基类
def __init__(self,name,kind,food):
self.name = name
self.kind = kind
self.food = food
def yell(self):
print('喵喵叫')
def eat(self):
print('吃猫粮')
def drink(self):
print('喝水')
class Cat(Animal): # 类名(父类名) 就是继承
def catch_mouse(self):
print('抓老鼠')
class Dag(Animal): # 子类/派生类
def look_after_house(self):
print('看家')
cat = Cat('阿猫','橘猫','猫粮','喵喵') # 实例化对象
cat.yell()
dag = Dag('阿狗','土狗','狗粮','旺旺')
dag.drink()
结果为:
喵喵叫
喝水
继承:通过子类名(父类名)实现对父类方法的继承。
父类/超类/基类
子类/派生类
2.1.1 继承与重用
class Animal: # 父类/超类/基类
def __init__(self,name,kind,food,language):
self.name = name
self.kind = kind
self.food = food
self.language = language
def yell(self):
print('%s叫'%self.language)
def eat(self):
print('吃%s'%(self.food))
def drink(self):
print('喝水')
class Cat(Animal): # 类名(父类名) 就是继承
def catch_mouse(self):
print('抓老鼠')
class Dag(Animal): # 子类/派生类
def look_after_house(self):
print('看家')
cat = Cat('阿猫','橘猫','猫粮','喵喵')
cat.yell()
dag = Dag('阿狗','土狗','狗粮','旺旺')
dag.eat()
结果为:
喵喵叫
吃狗粮
重用:猫和狗的叫和吃两个方法属于重用
2.1.2派生属性

当子类中有要被调用的方法的时候,子类的对象会直接选择子类中的方法、变量,父类中的方法不会被自动执行
如果我们既想要执行子类的方法,也想要执行父类的方法,那么需要在子类的方法中调用父类的方法:
1、父类名,方法名(self....)
2、super(),方法名(...)
这样就会帮我们在子类中调用父类中的同名方法

class Animal: # 父类/超类/基类
def __init__(self,name,kind,food,language):
self.name = name
self.kind = kind
self.food = food
self.language = language
def yell(self):
print('%s叫'%self.language)
def eat(self):
print('吃%s'%(self.food))
def drink(self):
print('喝水') class Cat(Animal): # 类名(父类名) 就是继承
def catch_mouse(self):
# Animal.drink(self) # 子类方法中调用父类方法
super().drink()
print('抓老鼠')
class Dag(Animal): # 子类/派生类
def look_after_house(self):
print('看家')
cat = Cat('阿猫','橘猫','猫粮','喵喵')
cat.catch_mouse()
结果为:
喝水
抓老鼠
2.2抽象类
作用:
多人开发、复杂的需求、后期的扩展
手段、来帮助我们完成规范
范例: 只需要了解
from abc import ABCMeta,abstractclassmethod
class Payment(metaclass=ABCMeta): # 模板的功能
@abstractmethod # 它是一个装饰器,装饰器放在函数和类的上一行
def pay(self):pass
class Alipay(Payment):
def pay(self,money):
print('使用支付宝支付了%s元'%money)
class Wechatpay(Payment):
def pay(self,money):
print('使用微信支付了%s元'%money)
class ApplePay(Payment):
def pay(self,money):
print('使用Applepay支付了%s元'%money)
def pay(obj,money):
obj.pay(money)
抽象类
抽象类是一个规范,他基本不会实现什么具体的功能,抽象类是不能被实例化
要想写有一个抽象类
from abc import ABCMeta,abstractclassmethod
在这个类创建的时候,指定metaclass=ABCMeta
#在你希望子类实现的方法上加一个@abstractmethod装置器
使用抽象类
继承这个类
必须实现这个类中被@abstractmethod装饰器装饰的方法
2.2多继承
class Parent1:pass
class Parent2:pass
class Son(Parent1,Parent2):pass
print(Son.__bases__) # 查看该类继承的所有父类
结果为:
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
# 不是多有的语言都支持多继承 jave
# c++支持多继承
举例:
class Animal:
def __init__(self,name):
self.name = name
class FlyAnimal(Animal):
def fly(self):
print('%s在飞'%self.name)
class WalkAnimal(Animal):
def fly(self):
print('%s在走路'%self.name)
class SwimAnimal(Animal):
def fly(self):
print('%s在游泳'%self.name)
class Tiger(SwimAnimal,WalkAnimal):
pass
class Swan(SwimAnimal,WalkAnimal,FlyAnimal):
pass
class Parrot(FlyAnimal,WalkAnimal):
def talk(self):
print('%s说话了'%self.name)
swan = Swan('天鹅')
swan.fly()
parrot = Parrot('鹦鹉')
parrot.talk()
parrot.fly()
结果为:
天鹅在游泳
鹦鹉说话了
鹦鹉在飞
三、新式类与经典类
新式类与经典类
新式类
在Python3.0里所有类都是新式类
所有的新式类都有一个默认的父类:object
class Person1:pass
class Person2():pass
class Person3(object):pass
# p = Person() # __init__初始化方法
print(Person1.__bases__) #(<class 'object'>,)
print(Person2.__bases__) #(<class 'object'>,)
print(Person3.__bases__) #(<class 'object'>,)
python 2.7
经典类与新式类 并存
class Student:pass # 经典类
class Student(object):pass
总结:
继承了object的类就是新式类
在py3中所有的类都是新式类
在py2中既有新式类又有经典类
继承规律:
继承方法是——遵循广度优先
继承object
mro方法
super:super不是单纯的找父类,而是遵循mro顺序的
class A:
def func(self):
print('A')
class B(A):
def func(self):
super().func()
print('B')
class C(A):
def func(self):
super().func()
print('C')
class D(B,C):
def func(self):
super().func()
print('D')
D().func()
结果为:
A
C
B
D
图解:

四、类与对象名称空间
1.只要对象的某个属性被直接赋值,那么一定是对象的命名空间发生变化。
2.只要是静态变量,借用类名操作。
python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试的更多相关文章
- python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- Java学习笔记二十一:Java面向对象的三大特性之继承
Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...
- 搞懂Python的类和对象名称空间
代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...
- Python面向对象的三大特性之继承和组合
继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...
- Java 面向对象的三大特性之一 继承
继承: Java是继承的三大特性之一,是Java中实现代码重用的手段之一 将重复的代码抽取到父类中继承的有点或者现实 优点: 方便修改代码 减少代码量 Java中继承的语法: 修饰符 SubClass ...
- 第三十篇 面向对象的三大特性之继承 supre()
继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和 多继承. # 定义父类 class ParentClass ...
- day 22 面向对象 类与对象 名称空间操作
一.面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式. 优点:复杂的问 ...
随机推荐
- 限制EditText最多输入n位,设置EditText最大输入长度;
1.比较笨的方法: /** * 设置edittext最大的输入限制 * @param editText * @param length */ private void setMaxLength(Edi ...
- TP框架做网页静态化
首先放上一张某手册中的一段代码: 我们要想在TP框架中执行网页静态化,在这段代码的基础上稍加添加就可以了: 在TP5框架中,为了方便寻找模板文件与生成的静态文件,我们将模板文件以及生成的静态文件放在p ...
- python初探 socket
1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立‘通信’的基础,建立连接,传 ...
- centos7 安装、使用git
1. 查看系统是否已经安装git git --version 2. 安装git yum install -y git 3. 查看是否安装成功 git --version 4. 卸载 yum remov ...
- 0. 资料官网【从零开始学Spring Boot】
[视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...
- 《算法》第二章部分程序 part 5
▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...
- Apache 服务器 基础知识小结
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软 ...
- spark partition 理解 / coalesce 与 repartition的区别
一.spark 分区 partition的理解: spark中是以vcore级别调度task的. 如果读取的是hdfs,那么有多少个block,就有多少个partition 举例来说:sparksql ...
- 修改Tomcat的网页端口和指向路径
网页端口是在 D:\web\apache-tomcat-6.0.32\conf 下的server.xml <Connector port="8080" protocol=&q ...
- 【ASP.NET 插件】分享一个可视化HTML编辑器 CKEditor.NET
因为公司网站的可视化HTML编辑器IE兼容性问题,js报错不能使用,于是在网上找到了个还行的,图片本地上传的话直接把图片拖到编辑窗口就可以了.这个编辑器是在开源中国看到的,个人觉得还不错! CKEdi ...