• Python高级编程技巧


    类与对象深度问题与解决技巧
    1.如何派生内置不可变类型并修改其实例化行为
    我们想自定义一种新类型的元组,对于传入的可迭代对象,我们只保留其中int类型且值大于0的元素,例如:

    IntTuple([2,-2,'jr',['x','y'],4]) => (2,4)
    

    如何继承内置tuple 实现IntTuple

    2.如何为创建大量实例节省内存
    在游戏中,定义了玩家类player,每有一个在线玩家,在服务器内则有一个player的实例,当在线人数很多时,将产生大量实例(百万级)

    如何降低这些大量实例的内存开销?

    解决方案:

    定义类的__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
    
  • 相关阅读:
    Effective C++笔记_条款25考虑写出一个不抛出异常的swap函数
    SilverLight小游戏
    可分片数据持久层ShardingPL使用说明
    r.a.d controls 学习笔记 - radcombobox + RadWindowManager 组成的参照控件
    用 .Net Remoting 技术实现“定向广播”
    Silverlight中的资源文件
    一个丑陋的对Silverlight中的Grid无CellPadding的解决方案
    几个小问题
    .Net Remoting 排错笔记:An existing connection was forcibly closed by the remote host
    .Net Remoting 排错笔记:The constructor to deserialize an object of type 'xxx.xxxx.xxxxx' was not found.
  • 原文地址:https://www.cnblogs.com/sakura579/p/12435243.html
Copyright © 2020-2023  润新知