python 入门基础21 --面向对象_多态、内置方法、反射
内容:
1.接口思想
2.抽象类思想
3.多态
4.内置方法
5.反射
1.接口思想
建立关联的桥梁,方便管理代码
接口类:用来定义功能的类,位继承它的子类提供功能
该类的功能方法一般不需要实现体,实现体由继承它的子类自己实现
2. 抽象类思想
抽象父类:拥有抽象方法(子类共有的方法,但是父类不能有具体的实现体)的父类
抽象方法:方法名是具体的,但实现体是抽象的(在子类中重写来具象化)
3. 多态
3.1 什么是多态
多态指的是同一种/类事物的不同形态
3.2 为何要用多态
多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
多态性的精髓:统一
多态的体现:功能或需求,需要父类的对象,可传入父类对象或任意子类对象均可
有抽象方法的父类,无法实例化
常见的多态及其带来的好处:
python中多种数据类型:字符串、列表、字典、元组等,都拥有通用的使用方法
例如:
"""
"""s = 'hello'
l = [1, 2, 3, 4]
t = (1, 2, 54, 4)
# 不同类型的数据都可以使用
print(len(s))
print(len(l))
print(len(t))
# 内部使用的就是多态的思想
s1 = s.__len__()
l1 = l.__len__()
t1 = t.__len__()
print(s1)
print(l1)
print(t1)
3.3 鸭子类型
1.规定有什么属性及什么方法的对象叫鸭子
2.能提供出规定的属性与方法的对象就是鸭子
解释2:(抽象的思想)
    两个类没有继承同一个类(都不继承类),但是二者含有相同的功能,
    就称这两个类是鸭子类型
“这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。””
# 二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:
    def read(self):
        pass
    def write(self):
        pass
class DiskFile:
    def read(self):
        pass
    def write(self):
        pass
4.内置方法
4.1 isinstance(obj, cls) 和 issubclass(sub, super)
# isinstance(obj, cls) 检查 obj 是否是类 cls 的对象
class Foo(object):
    pass
obj = Foo()
isinstance(obj, cls)
# issubclass(sub, supper) 检查 sub 类是否是 super 类的派生类
class Foo(object):
    pass
class Bar(Foo):
    pass
issubclass(Bar, Foo)
4.2 str
在对象被打印时自动触发,可以用来定义对象被打印时的输出信息
# 注意:必须返回一个字符串类型的值,
class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        # print('run..........')
        return '<name:%s age:%s>' % (self.name, self.age)
obj1 = People('zhangsan', 18)
print(obj1)  # print(obj1.__str__())
obj2=list([1,2,3])
print(obj2)
4.3 del
在对象被删除时先自动触发该方法,可以用来回收对象以外其他相关资源,比如系统资源
class Foo:
    def __init__(self, x, filepath, encoding='utf-8'):
        self.x = x
        self.f = open(filepath, 'rt', encoding=encoding)
    def __del__(self):
        print('run.....')
        # 回收对象关联的其他资源
        self.f.close()
obj = Foo(1, 'a.txt')
# del obj
print('主===========>')
4.4 call
在对象被调用时会自动触发该方法,可以用来???
class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __call__(self, *args, **kwargs):
        print(self, args, kwargs)
        print("----------------------------------")
obj = Foo(1, 2)
obj(1, 2, a=3, b=4)  # obj.__call__(obj,1,2,a=3,b=4)
5. 反射:通过字符串来反射/映射到对象/类的属性上
hasattr()
getattr()
setattr()
delattr()
class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def run(self):
        print('%s is running' % self.name)
obj = People('lisi', 18)
print(obj.__dict__)  # {'age': 18, 'name': 'lisi'}
print(hasattr(obj, 'name'))  # 'name' in obj.__dict__
print(getattr(obj, 'name'))  # obj.__dict__['name']
print(getattr(obj, 'xxx', '没找到啊'))  # obj.__dict__['xxx']
# 没有这个属性,会报错, 第三个参数为默认值,当找不到的时候,返回第三个参数内容
delattr(obj, 'name')
print(obj.__dict__)  # {'age': 18}
												
											python 入门基础21 --面向对象_多态、内置方法、反射的更多相关文章
- Python 入门基础20  --面向对象_继承、组合
		
今日内容 组合:自定义类的对象作为类的属性 继承:父类与子类.多继承 1.组合 将自定义类的对象作为类的属性 class Teacher: def __init__(self, name): self ...
 - 铁乐学python_day24_面向对象进阶1_内置方法
		
铁乐学python_day24_面向对象进阶1_内置方法 题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面 ...
 - Python学习day08-python进阶(2)-内置方法
		
Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法 xxxxxxxxxx 2 1 hobby_list ...
 - Python面向对象编程及内置方法
		
在程序开发中,要设计一个类,通常需要满足以下三个要求: [1]类名 这类事物的名字,满足大驼峰命名法 [2]属性 这类事物具有什么样的特征 [3]方法 这类事物具有什么样的行为 定义简单的类: 定义只 ...
 - Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
		
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
 - Python之路(第二十六篇) 面向对象进阶:内置方法
		
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
 - python基础语法18   类的内置方法(魔法方法),单例模式
		
类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...
 - Python之路(第二十七篇)  面向对象进阶:内置方法、描述符
		
一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...
 - JavaScript基础:BOM的常见内置方法和内置对象
		
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. BOM的介绍 JavaScript的组成 JavaScript基础分为三 ...
 
随机推荐
- mybatis  缓存(cache)的使用
			
许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的.类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsessio ...
 - [IOI2018]狼人——kruskal重构树+可持久化线段树
			
题目链接: IOI2018werewolf 题目大意:给出一张$n$个点$m$条边的无向图,点和边可重复经过,一个狼人初始为人形,有$q$次询问,每次询问要求人形态只能处于编号不小于$L$的点,狼形态 ...
 - Android 访问 Webapi 更新UI
			
首先,写一个访问webapi的工具类 import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import or ...
 - linux screen 命令 :离线运行程序
			
screen工具是linux下虚拟终端的一个常用工具.在 发现这个工具之前,笔者经常在远程ssh中运行需要长时间处理数据的命令,比如远程编译安装软件,如果在编译的过程中网络断开,那这个编译进程就会停止 ...
 - Leetcode 344.反转字符串 By Python
			
请编写一个函数,其功能是将输入的字符串反转过来. 示例: 输入:s = "hello" 返回:"olleh" 思路 Python里面的切片用来解决这个问题就很快 ...
 - CDQ分治学习笔记
			
数据结构中的一块内容:$CDQ$分治算法. $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一 ...
 - LOCALDB安装和连接
			
关于LOCALDB的详细文档说明,包含安装,连接,共享连接等操作 https://technet.microsoft.com/zh-cn/hh510202 目的: 调试程序没有安装 sql serv ...
 - 51单片机 | I/O口直接输入输出实例
			
51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...
 - display position 和float的作用和关系
			
1.传统布局由这三者构成. 2.position设为absolute,那么display一定是block,因此对于span来说,就可以设置高和宽了. 3.position为relative ,那么fl ...
 - (转)sublime text3简体中文版汉化教程
			
preferens——package controller——输入 install package——等待安装完成后输入 localizationChinese 请使用主菜单的 帮助/Language ...