多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg) ***** ## 类与对象深度问题与解决技巧 ### 1.如何派生内置不可变类型并修改其实例化行为 我们想自定义一种新类型的元组,对于传入的可迭代对象,我们只保留其中int类型且值大于0的元素,例如: ``` IntTuple([2,-2,'jr',['x','y'],4]) => (2,4) ``` 如何继承内置tuple 实现IntTuple ### 2.如何为创建大量实例节省内存 在游戏中,定义了玩家类player,每有一个在线玩家,在服务器内则有一个player的实例,当在线人数很多时,将产生大量实例(百万级) <br>如何降低这些大量实例的内存开销? <br>解决方案: - 定义类的\_\_slots\_\_属性,声明实例有哪些属性(关闭动态绑定) ### 3.Python中的with语句 上下文管理器协议 ### contextlib简化上下文管理器 ~~~ import contextlib @contextlib.contextmanager def file_open(filename): print("file open") yield {} print("file end") with file_open('lib1.py') as f: print("file operation") ~~~ ### 4.如何创建可管理的对象属性 在面向对象编程中,我们把方法看做对象的接口。直接访问对象的属性可能是不安全的,或设计上不够灵活,但是使用调用方法在形式上不如访问属性简洁。 ### 5.如何让类支持比较操作 有时我们希望自定义类的实例间可以使用,<,<=,>,>=,==,!=符号进行比较,我们自定义比较的行业,例如,有一个矩形的类,比较两个矩形的实例时,比较的是他们的面积 ### 6.如何在环状数据结构中管理内存 双向循环链表 ~~~ class Node: def __init__(self, data): self.data = data self.left = None self.right = None def add_right(self, node): self.right = node node.left = self def __str__(self): return 'Node:<%s>' % self.data def __del__(self): print('in __del__: delete %s' % self) def create_linklist(n): head = current = Node(1) for i in range(2, n + 1): node = Node(i) current.add_right(node) current = node return head head = create_linklist(1000) head = None import time for _ in range(1000): time.sleep(1) print('run...') input('wait...') ~~~ ### 通过实例方法名字的字符串调用方法 我们有三个图形类 ~~~ Circle,Triangle,Rectangle ~~~ 他们都有一个获取图形面积的方法,但是方法名字不同,我们可以实现一个统一的获取面积的函数,使用每种方法名进行尝试,调用相应类的接口 ~~~ class Triangle: def __init__(self,a,b,c): self.a,self.b,self.c = a,b,c def get_area(self): a,b,c = self.a,self.b,self.c p = (a+b+c)/2 return (p * (p-a)*(p-b)*(p-c)) ** 0.5 class Rectangle: def __init__(self,a,b): self.a,self.b = a,b def getArea(self): return self.a * self.b class Circle: def __init__(self,r): self.r = r def area(self): return self.r ** 2 * 3.14159 ~~~