day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)
多态是OOP的三大特征之一
字面意思:多种形态 多种状态
官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征)
多态不是什么新技术 我们编写面向对象的程序时 其实就有多态存在
import abc
class Animal(metaclass = abc.ABCMeat)
@abc.abstractmetnod
def eat(self):
pass
@abc.abstractmethod
def bark(self):
pass
@abc.abstractmethod
def sleep(self):
pass
class Person(Animal):
def eat(self):
print('人用筷子吃饭‘)
def bark(self):
print('hello)
def sleep(self):
print('躺着睡‘)
class Cat(Animal):
def eat(self):
print('猫用爪子吃‘)
def bark(self):
print('喵喵叫‘)
def sleep(self):
print(‘蜷着睡’)
obj = Person()
obj1 = Cat()
不同对象可以响应相同的方法 产生不同的结果
obj.eat()
obj1.eat()
对于对象的使用者而言 无需关心对象的具体实现 甚至不用关心具体类型 极大地降低了使用难度
def animal_admin(animal):
animal.eat()
animal.bark()
animal.sleep() animal_admin(obj)
animal_admin(obj1) class Pig(Animal):
def eat(self):
print("用鼻子拱") def bark(self):
print("哼哼") def sleep(self):
print("躺地上着睡") obj2 = Pig()
animal_admin(obj2) def MY_LEN(c):
print(c.__len__()) l1 = [1,2,3] text = "abc"
MY_LEN(l1)
MY_LEN(text)
"""
鸭子类型
python不会强行限制 必须干什么 或不干什么
就比如封装中的私有属性 你也是可以强行访问的
同理 在多态中 子类中你可以不使用ABC模块
python崇尚鸭子类型 如果一个对象 长得像鸭子 叫声像鸭子 走路像鸭子 那么他就是鸭子 """
class Cat:
def eat(self):
print("猫吃鱼") def sleep(self):
print("猫睡觉") class Dog:
def eat(self):
print("狗吃肉") def sleep(self):
print("狗睡觉") dog1 = Dog()
cat1 = Cat() dog1.eat()
cat1.eat() def animal_admin(animal):
animal.eat()
animal.sleep() animal_admin(dog1)
animal_admin(cat1)
"""
isinstance 与 issubclacc 用法
"""
# 判断一个对象是否是一个类的实例
a = 100
# print(type(a) == int)
# print(isinstance(10,int))
# print(isinstance("abc",int))
# print(isinstance("abc",object))
class A:
pass class B(A):
pass # 参数1 是儿子 参数2 是老子
print(issubclass(B,A))
"""
反射
反省
一个对象具备可以修改自身属性及方法的能力
从代码级别来看 反射就是通过字符串来操作对象的属性(属性的增删改查) hasattr 是否存在某个属性
getattr 获取某个属性
setattr 设置或修改属性
delattr 删除某个属性
"""
class Person:
def __init__(self,name):
self.name = name def say_hi(self):
print("hello name is %s" % self.name) p1 = Person("jgon") print(hasattr(p1,"name"))
if hasattr(p1,"name"):
print(getattr(p1,"name",None)) setattr(p1,"name","kgon")
print(getattr(p1,"name")) setattr(p1,"age",200) # 不存在age属性 就添加
print(getattr(p1,"age")) delattr(p1,"name") # 有一个工具类 提供了 upload 和download 功能
# 用户可以在控制台输入功能的名称来执行对应的功能
class Tools: def download(self):
print("starting download") def upload(self):
print("starting upload") t = Tools()
func = input("输入要执行的功能名称:")
if hasattr(t,func):
f = getattr(t,func,None)
f()
print(f)
else:
print("没有这个功能")
# __str__ 可以用于定制对象的打印格式
# 会在print对象时自动触发执行 # class Person:
# def __init__(self,name,sex,age):
# self.name = name
# self.sex = sex
# self.age = age
#
# def show_info(self):
# print("my name is %s age %s sex %s" %
# (self.name,self.age,self.sex))
# # 打印对象时自动触发
# def __str__(self):
# print("run")
# return ("my name is %s age %s sex %s" %
# (self.name,self.age,self.sex))
#
# p1 = Person("张大彪","man",20)
# # p1.show_info()
#
# print(p1)
# # print(Person) # __del__
# 对象从内存中删除时自动触发执行
# 1.程序运行完毕时
# 2.手动调用del
# 作用:用于做一些清理操作 比如开启了文件资源 就需要手动关闭
# 使用场景: 当你的对象在创建时同时开启了不属于解释器的资源
# 就需要在del中来回收资源
# 也称之为析构函数 构造 # class Student:
# # 对象从内存中删除时自动触发执行
# def __del__(self):
# print("run del")
#
# stu = Student()
#
# del stu
#
# import time
# time.sleep(5) # f = open("文件名称","rb")
# #
# #
# #
# #
# f.close() class MYRead:
def __init__(self,filepath,mode,encode):
self.filepath = filepath
self.mode = mode
self.encode = encode
self.file = open(filepath,mode,encoding=encode) def read_data(self):
return self.file.read() def __del__(self):
self.file.close()
print("文件已经关闭") r = MYRead("今日内容","rt","utf-8")
print(r.read_data())
day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)的更多相关文章
- 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理
''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...
- Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- 黑马程序员——OC基础 三种特性之封装
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1) set方法 1&g ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- Java面向对象的三大特性之一 多态
多态: 子类重写父类方法 1)位置:子类和父类中有同名的方法 2)方法名相同,返回类型和修饰符相同,参数列表相同 方法体不同 多态的优势和应用场合 多态:同一个引用类型,使用不同的实例而执 ...
- 新三种求数列中值SQL之效率再比拼
在 https://www.cnblogs.com/xiandedanteng/p/12677688.html 中我列举了三种求中值方案,其中日本人MICK的做法因为不适用于二百万结果集而放弃,取而 ...
随机推荐
- Hbase配置WEB UI界面
1 找到各个节点下面的Hbase-site.xml文件,添加如下配置 <property> <name>hbase.master.info.port</name> ...
- Django REST Framework API Guide 03
本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...
- It's a Mod, Mod, Mod, Mod World Kattis - itsamodmodmodmodworld (等差数列求和取模)
题目链接: D - It's a Mod, Mod, Mod, Mod World Kattis - itsamodmodmodmodworld 具体的每个参数的代表什么直接看题面就好了. AC代码: ...
- scrapy基本使用(一)
scrapy基本使用(一) 参考文档:Scrapy入门教程 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html scrapy ...
- bootstrap-table前端修改后台传来的数据重新进行渲染
使用bootstrap-table显示数据,后台传回数据以后,可能需要对其做调整,如需要前端为数据添加单位 回到顶部 调整数据代码 $("#"+tableId).bootstrap ...
- 前段基础之CSS
本文参考:https://www.cnblogs.com/ctztake/p/7577436.html CSS 语法 CSS规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' select ...
- Linux下的Jenkins+Tomcat+Maven+Git+Shell环境的搭建使用(jenkins自动化部署)【转】
jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...
- Session、LocalStorage、SessionStorage、Cache-Ctrol比较
1.Session Session是什么? 服务器通过 Set-Cookie给用户一个sessionIdsessionId对应 服务器 内的一小块内存每次用户访问服务器的时候,服务器就听过Sessio ...
- Flash芯片你都认识吗?
[导读]Flash存储器,简称Flash,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程的性能,还不会因断电而丢失数据,具有快速读取数据的特点;在现在琳琅满目的电子市场上,Flash总类可谓繁 ...
- HTML中添加音乐video embed audio
做H5页面时需要添加背景音乐,方法如下 方式一:<video controls="" autoplay="" name="media" ...