问个简单的类问题

快乐田伯光 2010-10-09 04:32:56
一本书上有这么个例子:

class Super:
def delegate(self):
self.action()

class Provider(Super):
def action(self):
print 'in Provider.action'


我的问题是,在基类里定义这个delegate()有什么意义? 看上去在基类里定义一个空的delegate(),在每个子类里去重新定义这个delegate()也一样也可以达到目的。
...全文
219 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2010-10-10
  • 打赏
  • 举报
回复
约定的东西应该是和不同的人打交道吧,倘若基类是别人写的,你就会提供它要求的,而不会费劲去改成自己的写法...
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
那可以这样:

class Super:
def delegate(self):
print 'in super class'

class Provider(Super):
def delegate(self):
Super.delegate(self)
print 'in Provider class'


[Quote=引用 4 楼 angel_su 的回复:]
觉得就只是约定而已,因为例子过于简单所以重写delegate也行。不过如果delegate要做很多事,但大部分不需要改写,提供约定的函数即可...
[/Quote]
angel_su 2010-10-10
  • 打赏
  • 举报
回复
觉得就只是约定而已,因为例子过于简单所以重写delegate也行。不过如果delegate要做很多事,但大部分不需要改写,提供约定的函数即可...
I_NBFA 2010-10-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 guosha 的回复:]
困惑我的是,对应C++, 这应该算是一个虚基类, 虚基类是不能直接拿来定义对象的. 但这个super类又可以拿来定义对象. 并且只要没有用到delegate()这个属性还都可以正常运转.

引用 2 楼 i_nbfa 的回复:
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。
[/Quote]
你知识学死了,设计模式是一组抽象的设计方式,语言只是其实现工具,
不过是有的在语法层支持的全面些,有的单薄点,甚至不支持。
C语言如何照样OOP。甚至汇编也行,只不过复杂度问题。
python就没有绝对私有成员一说,_只是约定,__混淆后想访问也照样能存取。
按照你想法,python根本不支持OOP。
super能实例化,但没人强迫你实例化,就象没人强迫你非要直接存取__一样。
按照虚基类设计super, super就是个虚基类。那么你再实例化它的对象有啥意义呢?
如果有意义,那你设计的压根就不是一个虚基类。
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
那你举举C语言哪里有重复的现象? 你实现同一个目标, 或许用不同的方式可以实现, 但实现的侧重点肯定是不一样的. 自然语言怎么能跟计算机语言相题并论?
[Quote=引用 13 楼 iambic 的回复:]
从语言的设计上讲也没什么重复不重复可言的,就像一个人可以走,也可以跑,也可以跳,还可以不转身就后退,你非要说这些功能重复也可以,但这都是自然而然的行为,一门语言就应该如此运作,并不需要是什么刻意设计的结果。
[/Quote]
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
我觉得你是搞反了, 这里是讨论python, 写这两个简单的例子只是为了讨论python的多态. 而并不是打印一个字符串, 用不着去用python去写两个类, 这么简单的代码没什么意义可言. 谢谢
[Quote=引用 13 楼 iambic 的回复:]
这种简单的例子只是出于演示,当然也没什么“必要性”可言。打印一个字符串用的着写两个class吗?用C语言也能做用得着用python吗?
[/Quote]
iambic 2010-10-10
  • 打赏
  • 举报
回复
这个东西当然有用了。比如设计模式里的template模式,C++里的private virtual function的惯用法,这个例子里更可能是adapter模式:把一个对象的接口转换成另外一个接口,以便和程序的其他部分进行交互。

这种简单的例子只是出于演示,当然也没什么“必要性”可言。打印一个字符串用的着写两个class吗?用C语言也能做用得着用python吗?

从语言的设计上讲也没什么重复不重复可言的,就像一个人可以走,也可以跑,也可以跳,还可以不转身就后退,你非要说这些功能重复也可以,但这都是自然而然的行为,一门语言就应该如此运作,并不需要是什么刻意设计的结果。

angel_su 2010-10-10
  • 打赏
  • 举报
回复
我是觉得python的类很随便的,类本身就是个对象,实例的类型在运行期也是知道,方法属性也可以在实例生成后再添加,所以实现的手法真要较真那可能5花8门没完没了。其实lz的写法应该是最直观最多的啦,不过示例明确要求实现一个方法相形更简洁,如果还有其它基类方法也用上的话犯不着一个个改写吧...
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
呵呵, 我很诚心来求教的, 只是交流, 不知你说的带了偏见是什么意思? 我只想求得一个令人信服的解释而已. 对于你解答问题的热情,我同样很感谢的

[Quote=引用 17 楼 iambic 的回复:]
算了,对于不准备认真接纳别人看法的人,没啥好讨论的了。因为你心中已经有固定的看法了。只能靠时间与经验去慢慢消磨你的偏见了。
[/Quote]
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
OK, 非常感谢!
[Quote=引用 16 楼 i_nbfa 的回复:]
引用 11 楼 guosha 的回复:
困惑我的是,对应C++, 这应该算是一个虚基类, 虚基类是不能直接拿来定义对象的. 但这个super类又可以拿来定义对象. 并且只要没有用到delegate()这个属性还都可以正常运转.

引用 2 楼 i_nbfa 的回复:
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。

你知识学死了,设计模式是……
[/Quote]
iambic 2010-10-10
  • 打赏
  • 举报
回复
算了,对于不准备认真接纳别人看法的人,没啥好讨论的了。因为你心中已经有固定的看法了。只能靠时间与经验去慢慢消磨你的偏见了。
angel_su 2010-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guosha 的回复:]
肯定是有的区别的. 要不然python的设计者也不会原谅自己做了两个功能完全一样的设计……
[/Quote]
如你见有区别,但功效一样不是么,觉的python重复的东西可不少,不过对实务上无啥影响...
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
困惑我的是,对应C++, 这应该算是一个虚基类, 虚基类是不能直接拿来定义对象的. 但这个super类又可以拿来定义对象. 并且只要没有用到delegate()这个属性还都可以正常运转.
[Quote=引用 2 楼 i_nbfa 的回复:]
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。
[/Quote]
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
呵呵, 如果我只是咬文嚼字,我根本就不会问这个问题了, 我想要知道的是在应用编程的时候怎么选取合适的方式.
至于两者的差别,肯定不会是你说的'差别就是谁写的约定是啥', 肯定是有的区别的. 要不然python的设计者也不会原谅自己做了两个功能完全一样的设计.
[Quote=引用 9 楼 angel_su 的回复:]
没说你的写法不行,但既然都可以实现,差别就是谁写的约定是啥,不需要过于咬文嚼字。你自己写的模块当然按自己的风格写,然后别人用的时候照办就是...
[/Quote]
angel_su 2010-10-10
  • 打赏
  • 举报
回复
没说你的写法不行,但既然都可以实现,差别就是谁写的约定是啥,不需要过于咬文嚼字。你自己写的模块当然按自己的风格写,然后别人用的时候照办就是...
vivi_zz 2010-10-10
  • 打赏
  • 举报
回复
快乐田伯光 2010-10-10
  • 打赏
  • 举报
回复
我没有看出你说的有什么差别,不过是在子类里把delegate的实现移动action()里而已. 你实现在delegate()跟在action()里怎么会有费劲不费劲的区别?
我想问的是这里有两种选择可以实现同样的效果,第一种是子类是直接重载delegate(), 第二种是基类delegate()里调用action, 子类实现action(). 我想知道的是有哪种情况第一种方式处理不了必须由第二种方式来处理.
[Quote=引用 6 楼 angel_su 的回复:]
约定的东西应该是和不同的人打交道吧,倘若基类是别人写的,你就会提供它要求的,而不会费劲去改成自己的写法...
[/Quote]
快乐田伯光 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iambic 的回复:]
看起来这段代码没什么实际意义,只是用来演示多态的。
[/Quote]

我知道这是用来演示多态的,但我没有看到这种必要.
比如:

class Super:
def delegate(self):
pass

class Provider(Super):
def delegate(self):
print 'in Provider.action'


这样做一样可以达到目的.

I_NBFA 2010-10-09
  • 打赏
  • 举报
回复
这是模拟虚基类或接口行为,基类不存在action定义,其对象自然也没意义,必须通过子类引用。
iambic 2010-10-09
  • 打赏
  • 举报
回复
看起来这段代码没什么实际意义,只是用来演示多态的。
内容概要:本文系统研究了基于模型预测控制(MPC)滚动优化的微电网多时间尺度能量管理调度方法,提出了一种结合多时间尺度协调机制与MPC滚动优化框架的调度模型,旨在应对可再生能源出力波动性和负荷不确定性带来的运行挑战。研究详细构建了包含风光储等多种分布式能源的微电网系统架构,设定了以运行成本最小化、碳排放降低和系统稳定性提升为核心的多目标优化函数,并充分考虑设备运行约束、功率平衡约束及储能动态特性等关键因素。文中给出了完整的Python代码实现方案,涵盖模型搭建、优化求解与结果可视化全过程,支持读者复现、验证并进一步拓展算法。该方法有效提升了微电网在复杂运行环境下的经济性、可靠性和低碳化水平。; 适合人群:具备一定电力系统分析基础和Python编程能力,从事微电网、综合能源系统、智能配电网、优化调度等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握MPC在微电网能量管理中的建模思想与实现流程;② 复现并改进多时间尺度调度模型,服务于学术论文撰写或实际项目开发;③ 深入理解滚动优化、预测误差修正与多时间尺度协调控制的技术内涵与工程价值。; 阅读建议:建议读者结合所提供的Python代码逐模块学习,理解各时间尺度(如日前、日内、实时)之间的衔接逻辑,配合优化理论与电力系统运行知识进行深入分析,鼓励在仿真平台中调整参数、设置不同场景以测试模型鲁棒性,从而全面提升对先进能量管理系统的设计与应用能力。
内容概要:本文围绕基于模型预测控制(MPC)的波浪能转换器(WEC)系统展开研究,系统阐述了如何利用Matlab代码实现MPC算法在WEC中的建模与仿真全过程。研究基于WEC的动力学特性,构建了精确的预测控制模型,通过引入滚动优化机制与实时反馈校正,有效提升了波浪能捕获效率与系统响应性能。文中详细解析了MPC控制器的核心设计流程,涵盖状态空间建模、预测时域设定、代价函数构造、系统约束处理及优化求解等关键技术环节,并配套提供了完整的Matlab代码实现方案,具有较强的可复现性与工程参考价值。; 适合人群:具备自动控制理论基础和Matlab编程能力的研究生、科研人员,以及从事海洋可再生能源系统开发的工程技术人员。; 使用场景及目标:①应用于波浪能发电系统的控制器设计与动态性能优化;②为海洋能源领域中模型预测控制策略的研究提供典型案例与技术参考;③支持高等院校及科研机构开展新能源控制技术相关的教学演示与实验研究; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现逻辑,重点钻研系统建模方法与控制器参数整定策略,可尝试调整波浪激励信号频谱特性或引入不同物理约束条件,观察控制效果的变化,从而深入掌握MPC在复杂可再生能源系统中的实际应用技巧与优化思路。

37,738

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧