欢迎光临散文网 会员登陆 & 注册

0718-面相对象(2)

2023-07-19 22:46 作者:GHWNM  | 我要投稿

如果没定义__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的话一下:

面向对象的架构用于设计和开发复杂的软件系统。它提供了一种组织和管理系统中各个组件的方式,使得系统具有更好的可维护性、可复用性和扩展性。以下是面向对象的架构的几个主要目标:


    模块化:面向对象的架构将系统划分为多个独立的模块,每个模块都具有清晰的功能和接口。这种模块化的设计使得系统更易于理解、修改和维护。


    封装:面向对象的架构通过封装数据和操作,将数据和操作组织为一个整体。这样可以隐藏实现细节,

    使得模块之间的耦合降低,提高了代码的可重用性和模块的独立性。


    继承:面向对象的架构通过继承机制,实现了代码的重用。

    通过继承,可以定义一个通用的基类,然后通过派生类对基类进行扩展和定制。这样可以减少代码的冗余,提高了代码的复用性和可维护性。


    多态:面向对象的架构通过多态性,提供了一种更加灵活和可扩展的设计方式。

    多态性意味着对象可以根据具体的上下文和需求,以不同的方式响应同一消息。这提高了系统的灵活性和可扩展性。


    松耦合:面向对象的架构通过封装、继承和多态性,实现了模块之间的低耦合性。

    这意味着一个模块的修改不会影响其他模块的功能和实现,使得系统更容易进行修改、扩展和维护。


综上所述,面向对象的架构是为了提高软件系统的可维护性、可复用性和扩展性。

它通过模块化、封装、继承、多态和松耦合等特性,使得系统的设计更加灵活、可扩展、易于理解和维护。


0718-面相对象(2)的评论 (共 条)

分享到微博请遵守国家法律