多态是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 面向对象 三种特性之一 多态 鸭子类型 反射(反省)的更多相关文章

  1. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  2. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  3. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  4. 黑马程序员——OC基础 三种特性之封装

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1)  set方法 1&g ...

  5. java多线程中的三种特性

    java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...

  6. python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  7. python基础学习 Day19 面向对象的三大特性之多态、封装

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  8. Java面向对象的三大特性之一 多态

    多态: 子类重写父类方法 1)位置:子类和父类中有同名的方法 2)方法名相同,返回类型和修饰符相同,参数列表相同       方法体不同 多态的优势和应用场合 多态:同一个引用类型,使用不同的实例而执 ...

  9. 新三种求数列中值SQL之效率再比拼

    在  https://www.cnblogs.com/xiandedanteng/p/12677688.html 中我列举了三种求中值方案,其中日本人MICK的做法因为不适用于二百万结果集而放弃,取而 ...

随机推荐

  1. ES6走一波 字符串的扩展

    ES6字符串扩展: 处理大码点字符 字符的Unicode表示法 \uxxxx表示一个字符串,超出 \u0000 ~ \uffff范围,必须用两个双字节形式表示. ES6改进为 将码点放到大括号 可正确 ...

  2. ListBox、ListCtrl

    设置编辑框滚动条在最新的位置 //CEdit* editBox=(CEdit*)GetDlgItem(IDC_EDIT_RECV); //(editBox->LineScroll(editBox ...

  3. Spring4之IOC

    或第六讲前也是讲此知识. \[www.dev1234.com]一头扎进Spring4视频教程\一头扎进Spring4源码\[www.java1234.com]<一头扎进Spring4>第六 ...

  4. eclipse快捷键调试总结 -转--快捷键大全

    (1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2      ---重命名类名 工程名 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时To ...

  5. Java开发环境配置(3)--eclipse汉化插件安装、卸载 中遇到的问题

    eclipse汉化中遇到的问题 网上汉化的帖子很多 如: Eclipse超级完美汉化教程_百度经验http://jingyan.baidu.com/article/e75057f28401a8ebc9 ...

  6. linux系统内核版本升级

    一.查看Linux内核版本命令(2种方法): 1.cat /proc/version 2.uname -a 二.查看Linux系统版本的命令(3种方法): 1.lsb_release -a 即可列出所 ...

  7. 2.获取公开的漏洞信息-查询还有哪些系统补丁未堵住-查询exp

    本章内容为第一课的实战部分,请结合原创一起浏览. 微软官网 https://www.microsoft.com/zh-cn 在页脚找到TechNet 查看安全公告 MS系列微软编号在微软安全报告中存在 ...

  8. k64 datasheet学习笔记3---Chip Configuration之Human machine interfaces

    1.前言 本文主要概略讲述GPIO相关的内容 2.GPIO configuration 注: GPIO模块没有访问保护,因为他没有连接到peripheral bridge slot上,不受MPU保护 ...

  9. Go语言中的map

    map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...

  10. camera理论基础和工作原理【转】

    转自:http://www.cnblogs.com/fjutacm/p/220631977df995512d136e4dbd411951.html 写在前面的话,本文是因为工作中需要编写摄像头程序,因 ...