多态是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. sqlserver字符串分割

    create function sp_split( @c nvarchar(4000), @splitchar nvarchar(1) ) returns @table table (word nva ...

  2. mongodb系列~ mongodb慢语句(1)

    1 简介:讲讲mongo的慢日志2 慢日志类型    query insert update delete 3 查看慢日志  1 db.system.profile.find() 慢日志总揽  2 d ...

  3. IOC 和DI的区别

    什么是spring的IOC AOP? - Goluck98的专栏 - 博客频道 - CSDN.NET---看前面的那段http://blog.csdn.net/goluck98/article/det ...

  4. 错误整理:No plugin found for prefix 'jetty' in the current project and in the plugin groups

    在maven进行jetty的调试中出现错误: [ERROR] No plugin found for prefix 'jetty' in the current project and in the ...

  5. Light oj 1099 - Not the Best 次短路

    题目大意:求次短路. 题目思路:由于可能存在重边的情况所以不能采用邻接矩阵储存图,我用了邻接表来存图. 由起点S到终点E的次短路可能由以下情况组成: 1.S到v点的次短路 + v到E的距离 2.S到v ...

  6. “指定的参数已超出有效值的范围”在【 parameterUpdate.Add(new OracleParameter("STATUS", 0));】报错

    改成:parameterUpdate.Add()); 就不报错,并不能知道为什么,有知道为什么的,评论告诉我. /// <summary> /// 插入数据 /// </summar ...

  7. 【SVN】关于钩子的一些使用

    前一段时间,李总让我研究一下SVN钩子的使用,以前没接触过这方面东西,在这里记录一下. 何为钩子? 所谓SVN钩子就是一些与版本库事件发生时触发的程序,例如新修订版本的创建,或者是未版本化属性的修改. ...

  8. MFC调用libyara遇到的问题

    测试结果 如果调用yara非要变成共享DLL的形式,加那么多的DLL,不如直接调用EXE文件.反而依赖vcruntime运行库的DLL会少很多... 调用libyara 调用libraya和C++调用 ...

  9. 理解和使用ThreadLocal类

    一.从数据结构入手 下图为ThreadLocal的内部结构图 从上面的机构图,可以窥见ThreadLocal的核心机制: 每个Thread线程内部都有一个Map: Map里面存储线程本地对象(key) ...

  10. linux系统快捷键

    tab 补全命令    两次tab    列出所有以字符前缀开头的命令 ctrl A    把光标移到命令行开头 ctrl E    把光标移到命令行结尾 ctrl C    强制终止当前的命令 ct ...