0718-面相对象(2)
如果没定义__str__则print的时候默认打印__repr__
__add__,定义之后就是'+'号,__iadd__,定义之后就是'+='号
如果没有__iadd__,就默认调__add__,__iadd__是+=,累加,可变数据+=前后都是相同地址/对象 # __iadd__
不可变数据,比如元组+=前后是不同地址,所以元组确实不能变,你硬+就是给你换了个新地址/对象 #__add__ return hself
也就是说__add__一定返回新,__iadd__一定返回旧
在class里定义__repr__,返回一个符合python语法的字符串
然后就能eval(repr(a1))
;‘
重要: __eq__是比较运算符(==)的魔法方法,默认是按照地址比较,重写一般可以把他比较内容
__gt__是比较运算符(>)大于,而且python自带的max,min,sort,index,count都会受这个影响(不止这些,remove,in啊,等等还有非常非常多的函数)
python的list里给你专门重写了eq的,比较的不再是地址,而是内容
或许python跟其他不一样就因为这些,方便,但是性能低,因为他比较啊,这些底层的魔法方法相对于C++,C等等来说要复杂很多
就比如==,python会给你比较内容,方便,但是慢; C++就只给你比较地址,很麻烦,但是快
再查了GPT之后发现魔法方法不是主要的,但是确实在特定环境下重写魔法方法会节省一定的性能开销
举个例子,如果你需要自定义一个类来表示大量的数据,而且你知道在进行比较操作时,并没有必要考虑所有的实例属性,
你可以手动重写__eq__(相等)和__ne__(不等)魔法方法,只比较你认为重要的属性,从而避免不必要的属性比较,从而提高性能
然而,需要注意的是,这种优化可能会牺牲一些代码的可读性和?灵活性。在进行性能优化时,最好先进行性能测试,确保自己的优化确实有显著的效果
另外,Python的运行速度一般是受到算法和数据结构的影响更大,对这些进行优化可能会比简单地重写魔法方法更有效
所以其实在C,C++等这些里面可以自己定义类似于python的函数或魔法属性,也就是自己写一个库,会比python的更快
然而,需要注意的是,使用编译型语言编写库通常需要更多的时间和努力,因为你需要手动管理内存、处理指针等低级别的操作
这个改魔法属性的很灵活,笔记上不好记,但是牢记很多东西是基于eq来比较的,所以更改eq很灵活,也要谨慎的对待
remove可以理解为电脑,然后厂商就想我要链啥,麦克风,摄像头,那么他就做了个接口(USB),相当于pyt的hon里的object
我们做的这些模型相当于就是所有的计算机外设,这就是软件设计架构的基本思想
客户端代码 --> 接口(父类,爸爸) -约束/规定/统一-> 具体功能
面向对象架构设计思想
总结:
1. 封装 根据需求划分为多个类型,为每个类型分配职责
分而治之,变而疏之,分治法
2. 继承 统一多个类型的共性行为 听父类的
所以不能改框架,比如remove,但是能改eq,能改比较的规则,隔离客户端代码与各种功能的变化
3. 多态 父类的方法在子类上有不同的体现(被重写了) 听子类的
编码时调用父类行为,运行时创建子类对象执行子类行为
所以父类是框架,调用它是因为稳定,如果你创建的时候调用的是那个具体的Model,调用的就是Model具体的eq策略(或其他)了
这样就可以达成本次的目标: ---开闭原则---
对扩展开放,对修改关闭
允许以类为单元增加新功能,不用(不能)修改客户端代码
举个例子,remove就是客户端,他不改吧,但是每天做这些新代码他都能帮我们删掉
print也是,他能打印各种各样新的类型,但是函数本身没变过
只需要修改__str__,__eq__等就行
所以这个框架实际上类似于HTTP协议,把后续扩展的东西规定格式(函数名,参数,返回值)
以便于后续功能扩展和客户端对接,这里引用GPT的话一下:
面向对象的架构用于设计和开发复杂的软件系统。它提供了一种组织和管理系统中各个组件的方式,使得系统具有更好的可维护性、可复用性和扩展性。以下是面向对象的架构的几个主要目标:
模块化:面向对象的架构将系统划分为多个独立的模块,每个模块都具有清晰的功能和接口。这种模块化的设计使得系统更易于理解、修改和维护。
封装:面向对象的架构通过封装数据和操作,将数据和操作组织为一个整体。这样可以隐藏实现细节,
使得模块之间的耦合降低,提高了代码的可重用性和模块的独立性。
继承:面向对象的架构通过继承机制,实现了代码的重用。
通过继承,可以定义一个通用的基类,然后通过派生类对基类进行扩展和定制。这样可以减少代码的冗余,提高了代码的复用性和可维护性。
多态:面向对象的架构通过多态性,提供了一种更加灵活和可扩展的设计方式。
多态性意味着对象可以根据具体的上下文和需求,以不同的方式响应同一消息。这提高了系统的灵活性和可扩展性。
松耦合:面向对象的架构通过封装、继承和多态性,实现了模块之间的低耦合性。
这意味着一个模块的修改不会影响其他模块的功能和实现,使得系统更容易进行修改、扩展和维护。
综上所述,面向对象的架构是为了提高软件系统的可维护性、可复用性和扩展性。
它通过模块化、封装、继承、多态和松耦合等特性,使得系统的设计更加灵活、可扩展、易于理解和维护。