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的做法因为不适用于二百万结果集而放弃,取而 ...
随机推荐
- Http 持久连接与 HttpClient 连接池
一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接. HTTP协议是全双工的协议, ...
- ES6 基础
转载自:ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来 ...
- script标签
script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件.默认情况下script标签的会阻止文档渲染,相关脚本会立即下载并执行. 属性 在HTML5中script主要有以下几个属 ...
- javascript/ajax和php 进阶 之 项目实战
1,使用异步思想做一个下拉列表,能够选择和展示数据库中对应的信息. 1,事件知识:所有的事件可参照:https://www.jb51.net/html5/459444.html 2,js中this补充 ...
- scrapy基础 之 爬虫入门:先用urllib2来跑几个爬虫
1,爬取糗事百科 概况:糗事百科是html网页,支持直接抓取html字符然后用正则过滤 爬取糗事百科需要同时发送代理信息,即user-agent import urllib2,re def pacho ...
- Wireshark技巧-过滤规则和显示规则【转】
转自:https://www.cnblogs.com/icez/p/3973873.html Wireshark是一个强大的网络协议分析软件,最重要的它是免费软件. 过滤规则 只抓取符合条件的包,在W ...
- Django 的系统时区设置 RPC
PRC Deprecated +08:00 +08:00 Link to Asia/Shanghai settings.py 文件的设置项: TIME_ZONE = 'PRC' 来源 ...
- replicate_wild_do_table和replicate-wild-ignore-table的使用【转】
使用replicate_do_db和replicate_ignore_db时有一个隐患,跨库更新时会出错. 如在Master(主)服务器上设置 replicate_do_db=test(my.conf ...
- NTSC、PAL、SECAM三大制式简介
NTSC.PAL.SECAM三大制式简介 NTSC.PAL和SECAM是全球三大主要的电视广播制式,这三种制式是不能互相兼容的,例如在PAL制式的电视上播放NTSC的视频,则影像画面将不能正常显示.下 ...
- spring3.1 profile 配置不同的环境
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...