习题:

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

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

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

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

实例:

import math
import json
import msgpack
import pickle class Shape:
"""防止直接调用父类的area方法"""
@property
def area(self):
raise NotImplementedError('基类未实现') class Triangle(Shape):
"""三角形"""
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c @property
def area(self):
p = (self.a+self.b+self.c)/2
return math.sqrt(p*(p-self.a)*(p-self.b)*(p-self.c)) class Rectangle(Shape):
"""矩形"""
def __init__(self,width,height):
self.width = width
self.height = height @property
def area(self):
return self.width * self.height def 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 = dumps
return cls @SerializableCircle # Circle=SerializableCircle(Circle)
class Circle(Shape):
"""圆形"""
def __init__(self,radius):
self.radius = radius @property
def 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'):
pass class SerializableCircleMixin(SerializableMixin,Circle):
""" 2.Mixin组合为类动态添加dumps方法"""
pass shapes = [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)

  

Python 动态添加类方法的更多相关文章

  1. python动态添加属性和方法

    ---恢复内容开始--- python动态添加属性: class Person(object): def __init__(self,newName,newAge): self.name = newN ...

  2. python 动态添加属性及方法及“__slots__的作用”

    1.动态添加属性 class Person(object): def __init__(self, newName, newAge): self.name = newName self.age = n ...

  3. python动态添加属性

    class A: def __init__(self, info ={}): self.info = info def __getattr__(self, item): return self.inf ...

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

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

  5. day_5.26python动态添加属性和方法

    python动态添加属性和方法 既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx '''2018-5-26 13:40:09pyth ...

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

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

  7. 细说python类2——类动态添加方法和slots(转)

    先说一下类添加属性方法和实例添加属性和方法的区别, 类添加属性属于加了一个以类为全局的属性(据说叫静态属性),那么以后类的每一个实例化,都具有这个属性.给类加一个方法也如此,以后类的每一个实例化都具备 ...

  8. Python __slots__限制动态添加变量

    Python是一种非常灵活的动态语言,有时感觉太灵活以至于不知道遵循什么样的规则去驾驭.不过Python已经是非常完备的语言,想实现什么样的功能都是有方法的,而且也很容易,比如限制一个类动态添加成员变 ...

  9. 第六种方式,python使用cached_property缓存装饰器和自定义cached_class_property装饰器,动态添加类属性(三),selnium webdriver类无限实例化控制成单浏览器。

    使用 from lazy_object_proxy.utils import cached_property,使用这个装饰器. 由于官方的行数比较少,所以可以直接复制出来用自己的. class cac ...

随机推荐

  1. linux_base_commond_one

    1.cd commond a. cd usr 切换到该目录下usr目录  b. cd ../ 切换到上一层目录  c.cd / 切换到系统根目录  d. cd ~ 切换到用户主目录 e. cd - 切 ...

  2. 原生JS实现淘宝无缝轮播

    <!DOCTYPE html ><html><head><meta http-equiv="Content-Type" content=& ...

  3. [译]ASP.NET Core 2.0 中间件

    问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public vo ...

  4. 利用大白菜制作多系统启动U盘(win+ubuntu+PE+...)

    网上提供的方法很多都过时了,不适用,要不就是讲的不清楚 我结合http://www.xuebuyuan.com/848003.html大神的方案,加以研究,整理出了此篇文章 先看下最终成果: 好了,感 ...

  5. Python基础3切片,字符串的方法

    切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长]  但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...

  6. java基础解析系列(九)---String不可变性分析

    java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---In ...

  7. iOS之ViewController的多层presentViewController的dismiss问题

    今天在Q群里有人问了个这么个问题: A,B,C,D 都是Viewcontroller.A.B.C.D使用present去切的 他是这么搞的: A -> B, B ->C, C->D, ...

  8. Java就业企业面试问题-ssh框架

    SSH框架阶段SSH的优缺点,使用场景?   Hibernate优点:   (1) 对象/关系数据库映射(ORM) 它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想 ...

  9. Shell中bash的特性小结

    Shell: 用户与操作系统之间完成交互式操作的一个接口程序,为用户提供简化了的操作:上世纪的70年代中期在贝尔实验室,Bourne位Unix开发了一个shell程序Bourne Shell,简称sh ...

  10. Github和Github for windows的使用简介

    很多程序员都把自己开发的代码放到Github上,方便自己管理也有利于别人查阅.所以这两天我也捣鼓了一下这个东西,现在把怎么使用Github和Github for windows简单的总结一下. 1.现 ...