习题:

1. Shape基类,要求所有子类都必须提供面积的计算,子类有三角形、矩形、圆。

2. 上题圆类的数据可序列化

第一种方法:使用Mixin多继承组合的方式,混入其它类的属性和方法

第二种方法:使用装饰器装饰类,动态添加属性和方法

实例:

import math
import json
import msgpack
import pickleclass Shape:"""防止直接调用父类的area方法"""@propertydef area(self):raise NotImplementedError('基类未实现')class Triangle(Shape):"""三角形"""def __init__(self,a,b,c):self.a = aself.b = bself.c = c@propertydef area(self):p = (self.a+self.b+self.c)/2return math.sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))class Rectangle(Shape):"""矩形"""def __init__(self,width,height):self.width = widthself.height = height@propertydef area(self):return self.width * self.heightdef SerializableCircle(cls):""" 1.装饰器为类动态添加dumps方法"""# print(cls)def dumps(self,t='json'):if t == 'json':return json.dumps(self.__dict__)elif t == 'msgpack':return msgpack.packb(self.__dict__)elif t == 'pickle':with open('dump.txt','wb') as f:return pickle.dump(self.__dict__,f)else:raise NotImplementedError('没有实现的序列化')cls.dumps = dumpsreturn cls@SerializableCircle     # Circle=SerializableCircle(Circle)
class Circle(Shape):"""圆形"""def __init__(self,radius):self.radius = radius@propertydef area(self):return (self.radius ** 2) * math.pi# def dumps(self,t='json'):#     if t == 'json':#         return json.dumps(self.__dict__)#     elif t == 'msgpack':#         return msgpack.packb(self.__dict__)#     elif t == 'pickle':#         with open('dump.txt','wb') as f:#             return pickle.dump(self.__dict__,f)#     else:#         raise NotImplementedError('没有实现的序列化')# sc = Circle(4)
# sc.dumps('pickle')class SerializableMixin:"""序列化"""def dumps(self,t='json'):if t == 'json':return json.dumps(self.__dict__)elif t == 'msgpack':return msgpack.packb(self.__dict__)elif t == 'pickle':with open('dump.txt','wb') as f:return pickle.dump(self.__dict__,f)else:raise NotImplementedError('没有实现的序列化')def loads(self,t='json'):passclass SerializableCircleMixin(SerializableMixin,Circle):""" 2.Mixin组合为类动态添加dumps方法"""passshapes = [Triangle(3,4,5), Rectangle(3,4), Circle(4)]
for s in shapes:print('The area of {} = {}'.format(s.__class__.__name__,s.area))#Mixin
scm = SerializableCircleMixin(4)
print(scm.area)
s = scm.dumps('msgpack')
print(s)#装饰器
sc = Circle(4)
s = sc.dumps('json')
print(s)

  

转载于:https://www.cnblogs.com/i-honey/p/7831866.html

Python 动态添加类方法相关推荐

  1. python动态添加类方法_Python 动态添加类方法

    习题: 1. Shape基类,要求所有子类都必须提供面积的计算,子类有三角形.矩形.圆. 2. 上题圆类的数据可序列化 第一种方法:使用Mixin多继承组合的方式,混入其它类的属性和方法 第二种方法: ...

  2. python 动态添加装饰器_python动态装饰器

    python的装饰器是静态的,也就是说你使用的装饰器一定是定义好的对象.在某些特殊的情况下,需要让动态使用装饰器. 警告 不要随便用这个办法,一点都不优雅,能够使用其他的方法规避动态调用装饰器就不要这 ...

  3. python 动态加载与静态加载_python中的元类、静态方法、类方法,动态添加方法...

    首先介绍几个概念: 1.#所谓的静态方法就是这个方法任何类都可以调用,程序一加载就存在的方法 2.所谓的类方法就是这个类一加载就存在的方法,不用实例化这个类就已经存在的方法 3.所谓的元类就是创建类的 ...

  4. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言相关概念 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C# ...

  5. Python动态类和动态方法的创建和调用

    借助于python的动态语言特性,很容易对对象进行添加方法或者属性,这也是python的灵活之一. 动态生成类的属性及其方法 在某些情况可能要根据不同的参数来动态生成不同的实例方法.静态方法.类方法. ...

  6. python删除类方法_python中向类中动态添加新特性及删除属性方法

    class Foo(object): pass obj = Foo() # 添加对象属性(对象名追加对象属性) obj.a = 100 # print(obj.a) # 添加类属性(类名称追加类属性) ...

  7. Python学习笔记:动态添加与删除属性与方法

    文章目录 一.Python语言特点 1.动态语言 2.动态类型语言 3.强类型语言 二.动态添加属性 1.添加对象属性 2.添加类属性 三.动态删除属性 1.删除实例属性 2.删除类属性 四.动态添加 ...

  8. 20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。...

    概念: 并行:同时运行 并发:看似同时运行  json后任然中文的问题 import jsond = {"名字":"初恋这件小事"}new_d1 = json. ...

  9. Python面型对象--重载运算符与动态添加属性

    魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic methods).魔术方法在类 ...

最新文章

  1. 从源码带你看懂functools的partial方法
  2. mysql存储语句_MYSQL 常用语句保存
  3. centos 获取硬件序列号_如何在 Linux 上查找硬件规格
  4. android实机闪退,安卓模拟器,安卓真机,进入播放界面就会闪退
  5. Python之Mac上搭建集成开发环境
  6. java中的文件操作:读取写入byte[]字节流、string字符串、list列表
  7. 总结oninput、onchange与onpropertychange事件的使用方法和差别
  8. 苹果手机如何投屏到电脑【无线有线】
  9. 悉尼大学计算机专业本科学费,悉尼大学
  10. 电脑扬声器耳机已拔出
  11. DirectX和OPenGL 与 UE4 U3D的关系是什么?
  12. OCR识别缺点_常用的OCR文字识别软件有哪些_软件动态论坛
  13. 视频提取音频怎么弄?快把这些方法收好
  14. jq 使用jSignature.js实现电子签名
  15. 请原谅,我还来不及长大
  16. 科普系列—低速容错CAN的容错机制介绍
  17. Linux CentOS7 同步时间的两种方式(npt 或者 rdate)
  18. 新浪短信WEBSERVICE--本文转载
  19. JAVA毕业设计钢材出入库管理系统计算机源码+lw文档+系统+调试部署+数据库
  20. V90伺服电机仿真程序 profinet通讯报文3控制伺服

热门文章

  1. 百余名欧洲议会议员发函 呼吁英国留在欧盟
  2. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)
  3. 触摸板库tslib的编译和配置
  4. bzoj1597[Usaco2008 Mar]土地购买
  5. 国产WEB漏洞测试平台——MST
  6. install scrapy with pip and easy_install
  7. Give root password for maintenance 问题解决.
  8. measure,layout,draw的相关方法
  9. 前端web:浏览器静态资源缓存策略
  10. inline内联的用法与作用